我在SQL Server中有一个带有时间戳的SQL表,如下所示:

  │ Timestamps
──┼────────────────────
1 │ 2022-09-23 15:01:00
2 │ 2022-09-23 15:02:00
3 │ 2022-10-03 14:52:00
4 │ 2022-10-03 14:53:00
5 │ 2022-10-03 14:54:00
6 │ 2022-10-03 14:56:00
7 │ 2022-10-03 14:57:00
8 │ 2022-10-03 14:58:00
9 │ 2022-10-03 14:59:00

我想从表中提取所有连续的日期范围,其中范围内的每个时间戳之间的差异只有一分钟.这是预期的结果:

  │ From                │ To
──┼─────────────────────┼─────────────────────
1 │ 2022-09-23 15:01:00 │ 2022-09-23 15:02:00
2 │ 2022-10-03 14:52:00 │ 2022-10-03 14:54:00
3 │ 2022-10-03 14:56:00 │ 2022-10-03 14:59:00

注意,例如,行3、4和5被分组为一行,因为时间戳2022-10-03 14:522022-10-03 14:532022-10-03 14:54是连续的.从2022-10-03 14:562022-10-03 14:59的剩余时间戳被分组到其自己的范围中,因为范围之间存在差距(应该是2022-10-03 14:55).

什么是实现这一点的SQL查询?

推荐答案

这似乎是一个classic 的鸿沟和岛屿.

Example

Select TS1 = min([timestamps])
      ,TS2 = max([timestamps])
 From ( 
        Select *
              ,Grp = row_number() over( order by [timestamps])
                   - datediff(minute,0,[timestamps])
         From YourTable
      ) A
 Group By Grp

Results

TS1                         TS2
2022-10-03 14:56:00.000     2022-10-03 14:59:00.000
2022-10-03 14:52:00.000     2022-10-03 14:54:00.000
2022-09-23 15:01:00.000     2022-09-23 15:02:00.000

Sql相关问答推荐

当编号和版本的唯一状态更改时报告

从2个表中查找每条记录的唯一最接近的日期匹配

如何在SQL中按每个子组的顺序更新数据?

当交叉联接3个或更多表时,实体框架中是否会传输冗余的行数据并占用数据库带宽?

SQL -滞后于上一个非重复值

将Dense_RANK列为聚合(非解析)函数(&A)

数组列的postgres更新查询

按两列分组,并根据SQL中的条件返回第三个列值

如果另一个表中不存在值列,则插入失败

提取连续时间戳范围的SQL

如何向 mariadb 添加外键?

使用临时表判断记录是否存在 - 如果存在则执行相同的操作

PostgreSQL:从多个字段收集特定指标的最后一个条目

错误:postgresql 中缺少表评级的 FROM 子句条目

创建具有多个子查询的 SQL 视图

如何在 JSONB 数组的每个对象中添加新的键值对- PostgreSQL

使用给定的变量对在循环中执行更新语句

连续几天购买的客户

如何根据 Amazon Athena 中的多个列值删除重复行?

如何在 Trino/Presto 中过滤掉 map 中的某些键?