【问题标题】:Generate row number based on group of number and increase the number if different digit appears根据数字组生成行号,如果出现不同的数字,则增加数字
【发布时间】:2022-02-07 18:40:56
【问题描述】:

我们希望根据序列列的序列列顺序生成行号。对于第 1 到第 3 行,系列为 1,因此应将它们分组为 1。在第 4 行,出现 0,这导致系列中断,因此应从那里更改分组。

数据和输出示例:

下面是生成数据的代码。

        Select 1 AS Sequence,1 AS Series UNION ALL
Select 2 AS Sequence,1 AS Series UNION ALL
Select 3 AS Sequence,1 AS Series UNION ALL
Select 4 AS Sequence,0 AS Series UNION ALL
Select 5 AS Sequence,1 AS Series UNION ALL
Select 6 AS Sequence,1 AS Series UNION ALL
Select 7 AS Sequence,1 AS Series UNION ALL
Select 8 AS Sequence,1 AS Series UNION ALL
Select 9 AS Sequence,0 AS Series UNION ALL
Select 10 AS Sequence,0 AS Series UNION ALL
Select 11 AS Sequence,0 AS Series UNION ALL
Select 12 AS Sequence,0 AS Series UNION ALL
Select 13 AS Sequence,0 AS Series UNION ALL
Select 14 AS Sequence,0 AS Series UNION ALL
Select 15 AS Sequence,0 AS Series UNION ALL
Select 16 AS Sequence,0 AS Series UNION ALL
Select 17 AS Sequence,0 AS Series UNION ALL
Select 18 AS Sequence,0 AS Series UNION ALL
Select 19 AS Sequence,0 AS Series UNION ALL
Select 20 AS Sequence,0 AS Series UNION ALL
Select 21 AS Sequence,1 AS Series UNION ALL
Select 22 AS Sequence,1 AS Series UNION ALL
Select 23 AS Sequence,1 AS Series 

【问题讨论】:

标签: sql-server tsql


【解决方案1】:

您可以尝试在子查询中使用LAG 窗口函数,然后使用SUM 条件聚合窗口函数来制作。

;with cte as (
   Select 1 AS Sequence,1 AS Series UNION ALL
Select 2 AS Sequence,1 AS Series UNION ALL
Select 3 AS Sequence,1 AS Series UNION ALL
Select 4 AS Sequence,0 AS Series UNION ALL
Select 5 AS Sequence,1 AS Series UNION ALL
Select 6 AS Sequence,1 AS Series UNION ALL
Select 7 AS Sequence,1 AS Series UNION ALL
Select 8 AS Sequence,1 AS Series UNION ALL
Select 9 AS Sequence,0 AS Series UNION ALL
Select 10 AS Sequence,0 AS Series UNION ALL
Select 11 AS Sequence,0 AS Series UNION ALL
Select 12 AS Sequence,0 AS Series UNION ALL
Select 13 AS Sequence,0 AS Series UNION ALL
Select 14 AS Sequence,0 AS Series UNION ALL
Select 15 AS Sequence,0 AS Series UNION ALL
Select 16 AS Sequence,0 AS Series UNION ALL
Select 17 AS Sequence,0 AS Series UNION ALL
Select 18 AS Sequence,0 AS Series UNION ALL
Select 19 AS Sequence,0 AS Series UNION ALL
Select 20 AS Sequence,0 AS Series UNION ALL
Select 21 AS Sequence,1 AS Series UNION ALL
Select 22 AS Sequence,1 AS Series UNION ALL
Select 23 AS Sequence,1 AS Series 
)

SELECT  Sequence,Series,
       SUM(CASE WHEN n_Series <> Series THEN 1 ELSE 0 END) OVER(ORDER BY Sequence) + 1 generalNumber
FROM (
 SELECT *,LAG(Series) OVER( ORDER BY Sequence) n_Series
 FROM CTE
) t1

sqlfiddle

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-21
    • 2021-05-09
    • 2012-05-02
    • 2021-02-27
    相关资源
    最近更新 更多