2011-06-02 57 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