-1

我有一列按升序排列的大部分连续的唯一日期。虽然日期大多是连续的,但在3天以下的日期中也有一些差距,有些则在3天以上。

我需要创建一个表,其中每条记录都有一个开始日期和一个包含 3 天或更短间隔的范围的结束日期。但如果间隔超过 3 天,则必须生成新记录。

所以如果日期是:

    1/2/2012
    1/3/2012
    1/4/2012
    1/15/2012
    1/16/2012
    1/18/2012
    1/19/2012

我需要:

    1/2/2012      1/4/2012
    1/15/2012     1/19/2012
4

1 回答 1

0

你可以这样做:

WITH CTE_Source AS
(
    SELECT *, ROW_NUMBER() OVER (ORDER BY DT) RN
    FROM dbo.Table1
)
,CTE_Recursion AS 
(
    SELECT *, 1 AS Grp 
    FROM CTE_Source
    WHERE RN = 1

    UNION ALL

    SELECT src.*, CASE WHEN DATEADD(DD,3,rec.DT) < src.DT THEN rec.Grp + 1 ELSE Grp END AS Grp
    FROM CTE_Source src
    INNER JOIN CTE_Recursion rec ON src.RN = rec.RN +1 
)   
SELECT 
MIN(DT) AS StartDT, MAX(DT) AS EndDT 
FROM CTE_Recursion
GROUP BY Grp

第一个 CTE 只是为所有行分配连续的数字,以便以后加入它们。然后使用递归 CTE,如果日期差异大于 3 天,您可以加入下一行分配组。最后只需按分组列分组并选择所需的结果。

SQLFiddle 演示

于 2013-08-29T11:01:35.030 回答