2013-08-29 74 views
-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 
+0

@DanzaiVer真的嗎?這是您對StackOverflow的貢獻?這是您在擴展這些知識方面的貢獻,以後會被其他人使用嗎? 如果您的帖子不包含想法,有用的鏈接或對該主題的其他問題,它沒有用。所以,爲自己保留它,並減少存儲在SO數據庫中的「洪水」。 – gotqn

+0

@gotqn你是不是也加入了洪水?因爲你的喧譁?我在問他到底做了什麼或做了什麼,這樣我就可以加上他在做什麼,所以不是你的老師,會把答案提供給你。 – user2705620

+0

SO是一個無需學習就能找到答案的地方。你向他問的是他的老師會問的。 – gotqn

回答

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

+0

我試過這個,它給了我一個錯誤,說遞歸的數量太大了。我有320k記錄。 –

+0

@JohnSmith在查詢結束處添加'OPTION(MAXRECURSION 0)'以允許無限遞歸 –