选择一个值范围

saw*_*per 2 sql-server gaps-and-islands

我在行中有以下数据:

1
2
3
6
7
15
16
Run Code Online (Sandbox Code Playgroud)

我想写一个SELECT语句来返回连续的范围。鉴于上面的示例数据,输出将是:

1,2,3
6,7
15,16
Run Code Online (Sandbox Code Playgroud)

Pau*_*ite 10

给定以下示例数据:

DECLARE @Data AS table
(
    data integer PRIMARY KEY
);

INSERT @Data
    (data)
VALUES
    (1),
    (2),
    (3),
    (6),
    (7),
    (15),
    (16);
Run Code Online (Sandbox Code Playgroud)

实现您所追求的结果的一种方法是:

WITH Grouped AS
(
    -- Identify groups
    SELECT 
        D.data,
        grp = D.data - ROW_NUMBER() 
            OVER (ORDER BY D.data)
    FROM @Data AS D
)
SELECT
    STUFF
    (
        (
            -- Concatenate items in the current group
            SELECT 
                [text()] = ',' + CONVERT(varchar(11), G2.data)
            FROM Grouped AS G2
            WHERE 
                G2.grp = Grouped.grp
            ORDER BY 
                G2.data
            FOR XML PATH ('')
        )
        -- Remove initial comma
        , 1, 1, ''
    )
FROM Grouped
GROUP BY 
    Grouped.grp;
Run Code Online (Sandbox Code Playgroud)

测试在 SQLfiddle