Индекс перенумерации SQL после группы по

У меня есть следующая входная таблица:

Seq         Group      GroupSequence
1           0           
2           4           A
3           4           B
4           4           C
5           0           
6           6           A
7           6           B
8           0           

Выходная таблица:

Line        NewSeq     GroupSequence
1           1           
2           2           A
3           2           B
4           2           C
5           3           
6           4           A
7           4           B
8           5           

Правила для входной таблицы:

  1. Любое положительное целое число в столбце Группа указывает, что строки сгруппированы вместе. Все поле может быть NULL или пустым. Значение null или 0 указывает, что строка обрабатывается сама по себе. В приведенном выше примере есть две группы и три «одиночных» строки.

  2. столбец GroupSequence — это одиночный символ, который сортируется внутри группы. NULL, пробел, «A», «B», «C», «D» — единственные допустимые символы.

  3. если Group имеет положительное целое число, в GroupSequence должен быть буквенный символ.

Мне нужен запрос, который создает выходную таблицу с новым столбцом, который упорядочен, как показано. Внешние приложения должны перебирать эту таблицу в порядке Line или NewSeq (тот же порядок, разные значения).

Я пробовал варианты GROUP BY, PARTITION BY, OVER() и т. д. БЕЗ успеха. Любая помощь высоко ценится.


person mac    schedule 14.12.2018    source источник


Ответы (1)


Возможно это поможет

Единственная хитрость здесь — Flg, которая будет указывать на новую групповую последовательность (значения будут 1 или 0). Тогда дело за малым sum(Flg) через оконную функцию.

Редактировать — обновлен метод Flg

Пример

Declare @YourTable Table ([Seq] int,[Group] int,[GroupSequence] varchar(50))
Insert Into @YourTable Values 
 (1,0,null)
,(2,4,'A')
,(3,4,'B')
,(4,4,'C')
,(5,0,null)
,(6,6,'A')
,(7,6,'B')
,(8,0,null)

Select Line = Row_Number() over (Order by Seq)
      ,NewSeq = Sum(Flg) over (Order By Seq)
      ,GroupSequence
 From  (
        Select * 
              ,Flg =  case when [Group] = lag([Group],1) over (Order by Seq) then 0 else 1 end
         From  @YourTable
       ) A
 Order By Line

Возврат

Line    NewSeq  GroupSequence
1       1       NULL
2       2       A
3       2       B
4       2       C
5       3       NULL
6       4       A
7       4       B
8       5       NULL
person John Cappelletti    schedule 14.12.2018