2011-06-02 58 views
2

我有一個名爲Assignment的2列表。表中包含的人(nvarchar(20))和天(date)的分配,喜歡這裏:在SQL Server中彙總日期

Person  Day 
------------------ 
John 2011-05-23 
John 2011-05-24 
John 2011-05-25 
John 2011-05-27 
John 2011-05-28 
John 2011-05-29 
Anna 2011-05-02 
Anna 2011-05-03 
Anna 2011-05-06 

我需要提取的日期範圍時出現的相鄰天的序列。輸出應該是每行一個字符串值:

------------------ 
John 2011-05-23 - 2011-05-25 
John 2011-05-27 - 2011-05-29 
Anna 2011-05-02 - 2011-05-03 
Anna 2011-05-06 - 2011-05-06 

我試過分組,然後

CAST(min(Day) AS VARCHAR) + ' - ' + CAST(max(Day) AS VARCHAR) 

,但它不能正常工作。

歡迎任何建議。 謝謝。

+0

這個答案可以適應你的表格。 http://stackoverflow.com/questions/6099279/need-help-finding-the-correct-t-sql-query/6099433#6099433 – 2011-06-02 21:12:30

+0

@Mikael埃裏克森謝謝你的工作,請寫你的評論作爲答案,我會接受。 – Func 2011-06-02 21:28:26

+1

從上面提到的答案...;與Cte作爲( 選擇*,DATEDIFF(D,0,A.Day) - ROW_NUMBER()OVER(由A.Person ORDER BY A.Day劃分)來自作業A的Grp ) 從人Cte 中選擇Person,MIN(Day),MAX(Day),Grp – 2011-06-02 21:30:37

回答

3
declare @T table(Person nvarchar(20), [Day] date) 

insert into @T values 
('John', '2011-05-23'), 
('John', '2011-05-24'), 
('John', '2011-05-25'), 
('John', '2011-05-27'), 
('John', '2011-05-28'), 
('John', '2011-05-29'), 
('Anna', '2011-05-02'), 
('Anna', '2011-05-03'), 
('Anna', '2011-05-06') 


;WITH cte AS 
(
SELECT *, 
     DATEDIFF(DAY,0,[Day])- 
     ROW_NUMBER() OVER (PARTITION BY Person ORDER BY [Day]) AS Grp 
FROM @T 
) 
SELECT Person, 
     MIN([Day]) AS DateFrom, 
     MAX([Day]) AS DateTo 
FROM cte 
GROUP BY Person, Grp 
+0

+1;很好的答案,無論如何,爲什麼我可以在這個職位上面看到你的名字'community wiki'? – 2011-06-02 21:36:55

+0

@daemon_x - 社區維基發佈不給聲譽的海報,因爲這個答案是馬丁的答案的直接副本http://stackoverflow.com/questions/6099279/need-help-finding-the-correct-t-sql - 查詢/ 6099433#6099433我認爲是正確的事情。 – 2011-06-02 21:40:20

+0

@Mikael - 所以你以某種方式將這個anwser標記爲社區wiki?我不知道這個魔法。你標記了你自己? – 2011-06-02 21:46:53