sql - SQL Server如何按连续记录分组
问题描述
我有这张表,我需要按 [id_2] 字段中的连续记录进行分组:
数据集:
id_1 id_2 datemin datemax
1 0 2019-01-01 10:14 2019-01-01 15:20
1 1 2019-01-01 15:21 2019-01-01 16:01
1 0 2019-01-01 16:02 2019-01-01 16:08
1 1 2019-01-01 16:09 2019-01-01 16:40
1 1 2019-01-01 16:41 2019-01-01 17:50
1 1 2019-01-01 17:51 2019-01-01 18:36
1 0 2019-01-01 18:36 2019-01-01 19:07
1 1 2019-01-01 19:08 2019-01-01 22:01
1 0 2019-01-01 22:02 2019-01-01 22:47
1 1 2019-01-01 22:47 2019-01-01 23:05
1 0 2019-01-01 23:06 2019-01-01 23:59
预期结果:
id_1 id_2 datemin datemax
1 0 2019-01-01 10:14 2019-01-01 15:20
1 1 2019-01-01 15:21 2019-01-01 16:01
1 0 2019-01-01 16:02 2019-01-01 16:08
1 1 2019-01-01 16:09 2019-01-01 18:36
1 0 2019-01-01 18:36 2019-01-01 19:07
1 1 2019-01-01 19:08 2019-01-01 22:01
1 0 2019-01-01 22:02 2019-01-01 22:47
1 1 2019-01-01 22:47 2019-01-01 23:05
1 0 2019-01-01 23:06 2019-01-01 23:59
分组必须考虑每个连续重复字段 [id_2] 的 datemin 和 datemax
我尝试了其他示例,但我根本不明白
非常感谢!
解决方案
这是差距和孤岛问题的一个例子。如果我假设时间框架拼凑在一起(即没有间隙)-或者您不关心间隙-那么最简单的方法可能是行号的不同:
select id_1, id_2, min(date_min), max(date_max)
from (select t.*,
row_number() over (partition by id_1 order by date_min) as seqnum,
row_number() over (partition by id_1, id_2 order by date_min) as seqnum_2
from t
) t
group by id_1, id_2, (seqnum - seqnum_2);
为什么这行得通有点难以解释。但是,如果您查看子查询的结果,您应该会看到两个行号之间的差异如何定义您要查找的组。
推荐阅读
- vector - 我应该在稀疏的 Vec 或 Rust 的 HashMap 中存储具有大孔的系列中的无序值吗?
- php - 当用户编辑配置文件时,使用 mysql/php 更新数据库中的表
- c# - 从 C# 通过电子邮件将登录电子邮件帖子发送到 firebase
- react-native - 如何为 Firestore 设置支出限制并响应本机应用程序
- kubernetes-helm - Helm Chart 安装期间出错:解析失败
- node.js - 如何为我的节点应用程序开发导入/导出功能
- firebase - Flutter firebase 复合查询监听器没有被触发
- python-3.x - Tkinter 框架和网格
- react-native - TouchableOpacity w/border radius 渲染但允许在半径外触摸
- android - 如何从对象调用函数?