查找大间隙之间的日期范围并忽略较小的间隙

时间:2013-08-29 00:07:42

标签: sql sql-server-2008 tsql

我按升序排列了一系列大致连续的唯一日期。虽然日期主要是连续日期,但日期不到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

1 个答案:

答案 0 :(得分: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只是为所有行分配连续数字,以便以后加入它们。然后使用recursive CTE,如果日期差异大于3天,您可以加入每个下一行分配组。最后,只需按列分组并选择所需的结果。

<强> SQLFiddle DEMO