分组依据后的SQL重编号索引

时间:2018-12-14 22:35:08

标签: tsql group-by partitioning rowset

我有以下输入表:

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()等变量,但均未成功。 任何帮助表示赞赏。

1 个答案:

答案 0 :(得分: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