按日期时间进行SQL分组,最大差异为x分钟

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的小时或甚至日期部分发生变化的其他行,结果不能用于分组.

所以这就是我被困住的地方.如果有人能指出我正确的方向,我真的很感激.

Gor*_*off 5

您希望根据它们之间的时间对相邻事务进行分组.我们的想法是分配某种分组标识符,然后将其用于聚合.

这是一种方法:

  • 识别组开始使用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)