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