【发布时间】:2019-05-02 07:19:57
【问题描述】:
我有一张如下表:
我需要按 Cat 和 Timestamp 对数据进行分组,并为每组提供一个计数。一个组被定义为一个 5 分钟的动态时间窗口,这意味着它可以跨越不同的时间。
查询结果应如下:
查看黄色的第一个表组。这些组应被检测到并计为一个,而未突出显示的组也应计为一个
现在我在 Stackoverflow 上阅读了许多解决方案,以下是我尝试过的相关解决方案:
- 创建 5 分钟的时间间隔组 - 这不起作用,因为跨越不同小时的时间戳不匹配为同一组
- 使用 ROWNUMBER() OVER(按类别按时间戳进行分区)并加入 t1.Cat = t2.Cat 和 t1.rn + 1 = t2.rn 。按 DATEDIFF 过滤。这不起作用,因为只能检测到两对。如果在 5 分钟内依次出现 5 个时间戳怎么办?
我将非常感谢您对此的任何帮助
ascii 表中的原始数据见下文
原始数据
+---------------------+----------+
| Timestamp | Category |
+---------------------+----------+
| 2018-10-01 04:06:12 | Cat1 |
| 2018-10-01 05:07:18 | Cat1 |
| 2018-10-01 05:07:19 | Cat1 |
| 2018-10-01 05:07:20 | Cat1 |
| 2018-10-01 06:09:29 | Cat1 |
| 2018-10-01 07:24:12 | Cat2 |
| 2018-10-01 07:30:43 | Cat2 |
| 2018-10-01 07:59:13 | Cat2 |
| 2018-10-01 08:02:15 | Cat2 |
| 2018-10-01 10:09:25 | Cat2 |
| 2018-10-01 11:13:42 | Cat2 |
+---------------------+----------+
【问题讨论】:
-
是否应该考虑第一个记录“2018-10-01 05:06:12”,因为下一个可用值是 05:07,在 5 分钟窗口内?
-
是的,这是正确的。抱歉,会修复图片
-
我已经更改了第一个时间戳,所以表格现在应该是正确的
标签: sql sql-server datetime group-by