首页 > 解决方案 > 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

我尝试了其他示例,但我根本不明白

非常感谢!

标签: sqlsql-server

解决方案


这是差距和孤岛问题的一个例子。如果我假设时间框架拼凑在一起(即没有间隙)-或者您不关心间隙-那么最简单的方法可能是行号的不同:

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);

为什么这行得通有点难以解释。但是,如果您查看子查询的结果,您应该会看到两个行号之间的差异如何定义您要查找的组。


推荐阅读