2015-04-06 212 views
0

我试图生成日期范围序列,如果排序中断,则将日期放在第二行。按日期分组排序

fldDate  TotalNo 
2015-04-01  10 
2015-04-02  10 
2015-04-03  10 
2015-04-04  10 
2015-04-05  10 
2015-04-06  10 
2015-04-07  10 
2015-04-08  10 
2015-04-09  12 
2015-04-10  12 
2015-04-11  12 
2015-04-12  12 
2015-04-20  12 
2015-04-21  12 
2015-04-22  12 
2015-04-23  12 
2015-04-24  12 
2015-04-25  12 

我真的难倒

我想这个表作为

StartDate  EndDate  TotalNo 
2015-04-01  2015-04-08 10 
2015-04-09  2015-04-12 12 
2015-04-20  2015-04-25 12 

意味着要么日期范围断裂或TotalNo改变应该创建一个新的行。

我已经做到了,但它不是完全的工作 我做喜欢

SELECT MIN(fldDate) AS StartDate, 
     MAX(fldDate) AS EndDate, 
     TotalNo 
FROM dbo.tbl1 
GROUP BY TotalNo 
ORDER BY fldDate 

它会创建一个像

StartDate  EndDate  TotalNo 
2015-04-01  2015-04-08 10 
2015-04-09  2015-04-25 12 
+0

本文很好地解释了这种技术。 http://www.sqlservercentral.com/articles/T-SQL/71550/ – 2015-04-06 13:42:54

+0

您可以参考以下解决方案的任何差距[microsoft technet](https://technet.microsoft.com/en-us/library/ aa175780%28v = sql.80%29.aspx) [sqlmag](http://sqlmag.com/sql-server-2012/solving-gaps-and-islands-enhanced-window-functions) [simple-talk ](https://www.simple-talk.com/sql/t-sql-programming/the-sql-of-gaps-and-islands-in-sequences/) – ughai 2015-04-06 13:52:04

回答

1

您可以通过减去fldDate整数序列识别组 - - 如由row_number()提供。减法后的连续日期将具有相同的值。其余的只是group by

select min(fldDate) as StartDate, max(fldDate) as EndDate, TotalNo 
from (select t.*, 
      dateadd(day, 
        - row_number() over (partition by TotalNo order by fldDate), 
        fldDate) as grp 
     from table t 
    ) t 
group by TotalNo, grp 
order by StartDate, TotalNo;