Индекс перенумерации SQL после группировки по - PullRequest
0 голосов
/ 15 декабря 2018

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

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. Любое положительное целое число в столбце Группа указывает, что строки сгруппированы вместе.Все поле может быть пустым или пустым.Ноль или 0 указывает, что строка обрабатывается сама по себе.В приведенном выше примере есть две группы и три «одиночные» строки.

  2. столбец GroupSequence - это один символ, который сортируется в группе.NULL, пусто, 'A', 'B' 'C' 'D' являются единственными допустимыми символами.

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

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

Я пробовал варианты GROUP BY, PARTITION BY, OVER () и т. Д., Но безуспешно.Любая помощь высоко ценится.

1 Ответ

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

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

Единственный трюк здесь 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
...