2015-04-06 207 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;