繁体   English   中英

在SQL Server 2008中获取数据集的开始和结束

[英]Get Starting and ending of a Dataset in SQL Server 2008

我需要从表中提取数据集的起点和终点。 对于Ex,如果数据如下:

1
5
10
15
20

40
45
50
55
60
65
70

现在,这两个数据集分别是1-20和40-70。因此,数据将始终是顺序的,单个数据集中的点之间的差异最大为7。因此,结果查询应给我3列:

1. 5  15
2. 45 65

即数据集中的倒数第二个点。

是否可以在不使用forloop游标的情况下进行操作。 如果可以,请发布查询。 我尝试做的是使用overpartition by但没有运气

如果我对您的理解正确,这将返回您的要求。

DECLARE @tmp TABLE
    (
        numVal INT PRIMARY KEY
    );

INSERT @tmp
VALUES
    ( 1 )
    ,( 5 )
    ,( 10 )
    ,( 15 )
    ,( 20 )
    ,( 40 )
    ,( 45 )
    ,( 50 )
    ,( 55 )
    ,( 60 )
    ,( 65 )
    ,( 70 );

;WITH breaks AS
    (
        SELECT 
            t.numval breakMax
            , ROW_NUMBER()
                OVER(
                    ORDER BY t.numval
                    ) breakGroup
        FROM 
            @tmp t
        WHERE 
            NOT EXISTS
                (
                    SELECT
                        NULL
                    FROM 
                        @tmp t1
                    WHERE
                        t1.numVal > t.numVal
                        AND 
                        t1.numVal <= t.numVal + 7
                )
    )
SELECT
    v.breakGroup
    , MIN(v.numval) secondNum
    , MAX(v.numVal) secondLastNum
FROM 
    ( 
        SELECT
            t.numVal
            , br.breakGroup
            , ROW_NUMBER()
                OVER(
                    PARTITION BY 
                        br.breakGroup
                    ORDER BY 
                        t.numval 
                    ) ar
            , ROW_NUMBER()
                OVER(
                    PARTITION BY 
                        br.breakGroup
                    ORDER BY 
                        t.numval DESC
                    ) dr
        FROM    
            @tmp t
        CROSS APPLY
            (
                SELECT 
                    TOP 1
                    breakGroup
                FROM 
                    breaks b
                WHERE    
                    b.breakMax >= t.numVal
                ORDER BY 
                    b.breakGroup 
            ) br
    ) v
WHERE
    v.ar = 2
    OR 
    v.dr = 2
GROUP BY 
    v.breakGroup

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM