我有以下输入表:
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
输入表的规则为:
“组”列中的任何正整数表示行被分组在一起。整个字段可以为NULL或空白。 null或0表示该行是单独处理的。在上面的示例中,有两个组和三个“单”行。
GroupSequence列是在组内排序的单个字符。 NULL,空白,“ A”,“ B”,“ C”,“ D”是唯一允许的字符。
如果Group具有正整数,则GroupSequence中必须包含字母字符。
我需要一个查询,该查询使用新列创建输出表,该列按如下所示排序。 外部应用程序需要以Line或NewSeq顺序(相同顺序,不同值)遍历该表
我尝试了GROUP BY,PARTITION BY,OVER()等变量,但均未成功。 任何帮助表示赞赏。
答案 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