使用 Row_Number 查找连续行数

Ora*_*oda 9 t-sql gaps-and-islands

我有一列整数表示信号的发生,我正在尝试添加一列显示连续行的计数

如果我的数据看起来像这样

724
727
728
733
735
737
743
747
749
Run Code Online (Sandbox Code Playgroud)

具有连续行计数列的结果数据将如下所示

724 1
727 1
728 2
729 3
735 1
737 1
743 1
744 2
748 1
Run Code Online (Sandbox Code Playgroud)

我已经使用循环函数完成了它,但我正在尝试使用 cte。这是我最近尝试的示例

DECLARE @d TABLE ( signal INT )
INSERT  INTO @d
        SELECT  724
        UNION
        SELECT  727
        UNION
        SELECT  728
        UNION
        SELECT  729
        UNION
        SELECT  735
        UNION
        SELECT  737
        UNION
        SELECT  743
        UNION
        SELECT  744
        UNION
        SELECT  748 ;
WITH    a AS ( SELECT   signal,
                        ROW_NUMBER() OVER ( ORDER BY signal ) AS marker
               FROM     @d
             ) ,
        b AS ( SELECT   a1.signal,
                        CASE ( a1.signal - a2.signal )
                          WHEN 1 THEN 1
                          ELSE 0
                        END consecutiveMarker
               FROM     a a1
                        INNER JOIN a a2 ON a2.marker = a1.marker - 1
             )
    SELECT  *
    FROM    b
Run Code Online (Sandbox Code Playgroud)

产生这些结果

signal  consecutiveMarker
727 0
728 1
729 1
735 0
737 0
743 0
744 1
748 0
Run Code Online (Sandbox Code Playgroud)

第一个明显的问题是缺少系列中的第一个信号。除此之外,我想我可以将它传递给另一个 cte,并在连续标记上使用 row_number 分区。这不起作用,因为它将其分区为一个分区。我找不到向分区方法表明一个系列与下一个系列分开的方法

任何帮助表示赞赏。

Mar*_*ith 17

这种类型的查询的通用名称是“间隙和岛屿”。下面的一种方法。如果源数据中有重复项,则可能需要dense_rank而不是row_number

WITH DATA(C) AS
(
SELECT 724 UNION ALL
SELECT 727 UNION ALL
SELECT 728 UNION ALL
SELECT 729 UNION ALL
SELECT 735 UNION ALL
SELECT 737 UNION ALL
SELECT 743 UNION ALL
SELECT 744 UNION ALL
SELECT 747 UNION ALL
SELECT 749
), T1 AS
(
SELECT C,
       C - ROW_NUMBER() OVER (ORDER BY C) AS Grp
FROM DATA)
SELECT C,
       ROW_NUMBER() OVER (PARTITION BY Grp ORDER BY C) AS Consecutive
FROM T1
Run Code Online (Sandbox Code Playgroud)

退货

C           Consecutive
----------- --------------------
724         1
727         1
728         2
729         3
735         1
737         1
743         1
744         2
747         1
749         1
Run Code Online (Sandbox Code Playgroud)