SQL Server Группировка несвязанных записей по значению строки - PullRequest
0 голосов
/ 17 декабря 2018

Как группировать повторяющиеся записи?

У меня есть один столбец, который обозначает, является ли запись началом, концом или подробной записью.Подробные записи - это записи, которые существуют после начальной записи и перед конечной записью.

Я хочу сгруппировать эти записи вместе с уникальным идентификатором, чтобы каждый раз, когда есть конечная запись, следующая серия записей получала новыйid группы.

Я пробовал серию самостоятельных объединений, подзапросов и cte без создания пользовательской функции, представления или CTE. Я надеюсь построить это в одном запросе выбора.

Любые советы или указатели очень ценятся.

Пример перед решением:

--------------------------------------------------
| ID      | RecordType    |  SomeValue
--------------------------------------------------
|001      | Start record  |  some header info
|002      | Detail Record |  value
|003      | Detail Record |  value
|004      | Detail Record |  value
|005      | End Record    |  some other header info
|006      | Start Record  |  some header info
|007      | Detail Record |  Value
|008      | End  Record   |  some other header info

Что я пытаюсь достичь:

------------------------------------------------------------------
| ID      | RecordType    |  SomeValue             | RecordGroup
------------------------------------------------------------------
|001      | Start record  |  some header info      | 001
|002      | Detail Record |  value                 | 001
|003      | Detail Record |  value                 | 001
|004      | Detail Record |  value                 | 001
|005      | End Record    |  some other header info| 001
|006      | Start Record  |  some header info      | 002
|007      | Detail Record |  Value                 | 002
|008      | End  Record   |  some other header info| 002

1 Ответ

0 голосов
/ 17 декабря 2018

Вы можете использовать функцию LAG и запустить SUM.Далее предполагается, что разделения нет, и строки упорядочены по идентификатору:

SELECT ID, RecordType, SomeValue,
       SUM(chg) OVER (ORDER BY ID) AS grp
FROM (
    SELECT ID, RecordType, SomeValue,
           CASE WHEN LAG(RecordType) OVER (ORDER BY ID) IN ('Start record', 'Detail Record') THEN 0 ELSE 1 END AS chg
    FROM t
) cte1

Демонстрация на DB Fiddle

...