首页 > 解决方案 > sql时间点到时间范围

问题描述

我有以下 sql 表:

id   time
1    2018-12-30
1    2018-12-31
1    2018-01-03
2    2018-12-15
2    2018-12-30

我想进行查询,这将导致以下数据:

id  start_time end_time
1   2018-12-30 2018-12-31
1   2018-12-31 2018-01-03
2   2018-12-15 2018-12-30

这甚至可以在合理的时间内用 sql 完成,还是用其他方式更好?

失败的方法(需要太多时间):

SELECT id, time as start_time, (
    SELECT MIN(time)
    FROM table as T2
    WHERE T2.id = T1.id
    AND T2.time < T1.time
) as end_time
FROM table as T1

我的数据库中有日期,每个日期都有非唯一 ID。我想计算每个 id 的最接近日期之间的时间范围。所以转换应该分别对每个id进行,不应该影响其他id。我们甚至可以忘记 id,想象一下我的数据库中只有一列是日期。我想对我的日期进行排序并使用步骤 1 和容量 2 执行滑动窗口。因此,如果我有 10 个日期,我希望在结果中有 9 个时间范围,它们应该按递增顺序排列。假设我们有四个日期:D1 < D2 < D3 < D4。结果应该是 (D1,D2), (D2,D3), (D3,D4)

标签: mysqlsql

解决方案


在 MySQL 8.x 中,您可以使用该LEAD()函数查看下一行:

with x as (
  select
    id,
    time as start_time,
    lead(time) over(partition by id order by time) as end_time
  from my_table
)
select * from x where end_time is not null

推荐阅读