0

我有以下输入表:

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. Group 列中的任何正整数表示行被分组在一起。整个字段可能为 NULL 或空白。null 或 0 表示该行是单独处理的。在上面的示例中,有两个组和三个“单”行。

  2. GroupSequence 列是在组内排序的单个字符。NULL、空白、“A”、“B”、“C”、“D”是唯一允许的字符。

  3. 如果 Group 为正整数,则 GroupSequence 中必须有字母字符。

我需要一个查询来创建输出表,其中包含一个按所示顺序排列的新列。外部应用程序需要以 Line 或 NewSeq 顺序遍历此表(相同的顺序,不同的值)

我尝试了 GROUP BY、PARTITION BY、OVER() 等的变体,但没有成功。非常感谢任何帮助。

4

1 回答 1

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
于 2018-12-14T22:47:46.930 回答