Fel*_*lix 8 sql sql-server sql-server-2014
我在MS SQL Server中对数据集进行分组时遇到问题.
我的桌子看起来像
# | CustomerID | SalesDate | Turnover
---| ---------- | ------------------- | ---------
1 | 1 | 2016-08-09 12:15:00 | 22.50
2 | 1 | 2016-08-09 12:17:00 | 10.00
3 | 1 | 2016-08-09 12:58:00 | 12.00
4 | 1 | 2016-08-09 13:01:00 | 55.00
5 | 1 | 2016-08-09 23:59:00 | 10.00
6 | 1 | 2016-08-10 00:02:00 | 5.00
Run Code Online (Sandbox Code Playgroud)
现在我想将SalesDate差异与下一行的行分组最多为5分钟.因此第1行,第2行,第3行和第4行以及第5行和第6行都是一组.
我的方法是使用DATEPART()函数获取分钟并将结果除以5:
(DATEPART(MINUTE, SalesDate) / 5)
Run Code Online (Sandbox Code Playgroud)
对于第1行和第2行,结果将为3,并且此处的分组将完美地工作.但对于SalesDate的小时或甚至日期部分发生变化的其他行,结果不能用于分组.
所以这就是我被困住的地方.如果有人能指出我正确的方向,我真的很感激.
您希望根据它们之间的时间对相邻事务进行分组.我们的想法是分配某种分组标识符,然后将其用于聚合.
这是一种方法:
lag()和日期算术.查询如下所示:
select customerid, min(salesdate), max(saledate), sum(turnover)
from (select t.*,
sum(case when salesdate > dateadd(minute, 5, prev_salesdate)
then 1 else 0
end) over (partition by customerid order by salesdate) as grp
from (select t.*,
lag(salesdate) over (partition by customerid order by salesdate) as prev_salesdate
from t
) t
) t
group by customerid, grp;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
179 次 |
| 最近记录: |