需要按连续日期对记录分组SQL

问题描述 投票:0回答:2

我正在建立查询以建立连续的日期,这是>

create table #consecutivedates (
    sgid nvarchar(max), 
    metric nvarchar(max), 
    targetvalue nvarchar(max), 
    startdate datetime, 
    enddate datetime
)

insert into #consecutivedates values 
    ('2177', '515818', '18', '2019-09-01',  '2019-09-30'),
    ('2177', '515818', '125', '2019-08-01',  '2019-08-31'),
    ('2177', '515818', '15', '2019-07-01',  '2019-07-31')

SELECT  sgid,metric, CAST(startdate AS DATE) startdate, CAST(enddate AS DATE) enddate,
        ROW_NUMBER() OVER ( ORDER BY sgid, metric, startdate ) rn
INTO    #temp
FROM    #consecutivedates

-- GroupingColumn in cte used to identify and group consecutive dates
;WITH    cte
          AS ( SELECT   sgid ,
          metric , 
                        startdate ,
                        enddate ,
                        1 AS GroupingColumn ,
                        rn
               FROM     #temp
               WHERE    rn = 1
               UNION ALL
               SELECT   t2.sgid ,
               t2.metric,
                        t2.startdate,
                        t2.enddate ,
                        CASE WHEN t2.startdate = DATEADD(day, 1, cte.enddate) 
                                  AND cte.sgid = t2.sgid AND cte.metric=t2.metric
                             THEN cte.GroupingColumn
                             ELSE cte.GroupingColumn + 1
                        END AS GroupingColumn ,
                        t2.rn
               FROM     #temp t2
                        INNER JOIN cte ON t2.rn = cte.rn + 1
             )
    SELECT  sgid,metric, MIN(startdate) AS startdate, MAX(enddate) AS enddate
    FROM    cte
    GROUP BY sgid,metric, GroupingColumn

DROP TABLE #temp
DROP TABLE #consecutivedates

但是我面临两件事的问题。

  1. [当文件很大时查询太昂贵。

  2. 如果日期类似于

  3. 开始日期结束日期'2019-08-01''2019-09-30''2019-10-01''2019-10-31'

    然后查询将不对日期进行分组,我需要它足够聪明以解决这种情况。

任何帮助都会很好,

谢谢。

我正在构建一个查询以构建连续的日期,这是创建表#consecutivedates(sgid nvarchar(max),metric nvarchar(max),targetvalue nvarchar(max),startdate ...

sql performance date gaps-and-islands
2个回答
0
投票
我强调您想将sgidmetric相同且相邻的记录归为一组(即,下一条记录从当前记录结束后的第二天开始)。

0
投票
窗框的性能可能更高,但是您需要对其进行测试。这是替代解决方案:
© www.soinside.com 2019 - 2024. All rights reserved.