按日期分组排序
问题描述:
我试图生成日期范围序列,如果排序中断,则将日期放在第二行。按日期分组排序
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
答
您可以通过减去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;
本文很好地解释了这种技术。 http://www.sqlservercentral.com/articles/T-SQL/71550/ – 2015-04-06 13:42:54
您可以参考以下解决方案的任何差距[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