我有数据需要查询,以找出哪个人在9个月内花费最多。我的数据跨越5年,9个月的时间可能包括从一年到下一年的月份。
例如2005年10月至2006年7月。
我设法按人格和月份和年份进行分组,但有没有办法让我按照9个月的时间分组?我想如果我能做到那么我就可以找到该分组中的最大值。
答案 0 :(得分:1)
借助日期表或在我的情况下使用udf
Select DateR1,DateR1,PersonID,TotalSpent=sum(Spent)
From [SomeTable] A
Join (
Select DateR1=DateAdd(MM,-9,RetVal)
,DateR2=DateAdd(DD,-1,RetVal)
from [dbo].[udf-Create-Range-Date]('2005-10-01','2016-07-31','MM',1)
) B on A.DataDate between B.DateR1 and B.DateR2
Group By DateR1,DateR2,PersonID
Order by 1,3
子查询返回
DateR1 DateR2
2005-01-01 2005-09-30
2005-02-01 2005-10-31
2005-03-01 2005-11-30
2005-04-01 2005-12-31
2005-05-01 2006-01-31
2005-06-01 2006-02-28
...
2015-09-01 2016-05-31
2015-10-01 2016-06-30
2015-11-01 2016-07-31
因此,在日期范围之间聚合数据只是一个小问题
这是一个滚动的9个月如果不滚动
Select DateR1,DateR2=DateAdd(DD,-1,DateR2) from [dbo].[udf-Create-Range-Date-Span]('2005-10-01','2016-07-31','MM',9)
返回
DateR1 DateR2
2005-10-01 2006-06-30
2006-07-01 2007-03-31
2007-04-01 2007-12-31
2008-01-01 2008-09-30
2008-10-01 2009-06-30
2009-07-01 2010-03-31
2010-04-01 2010-12-31
2011-01-01 2011-09-30
2011-10-01 2012-06-30
2012-07-01 2013-03-31
2013-04-01 2013-12-31
2014-01-01 2014-09-30
2014-10-01 2015-06-30
2015-07-01 2016-03-31
2016-04-01 2016-07-30