mysql - 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)
解决方案
在 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
推荐阅读
- c++ - 使用 STL 算法根据存储在另一个向量中的权重对向量进行排序
- javascript - Lambdatest 中测试的随机化环境
- email - 为什么来自 iredmail 的邮件会进入每个邮件提供商的垃圾邮件文件夹?
- git - 在 Cloudbuild 中安装软件包时收到“无法读取 'https://github.com' 的用户名:终端提示已禁用”
- javascript - 在 JS 中,为什么 event.target 会根据它是在模板文字中还是添加到字符串中给出不同的结果
- docker - 我想通过 docker 容器使用 shell 执行器在 gitlab-runner 中构建 docker 映像
- firebase - 如何将文档的ID存储在flutter firestore中的同一文档中
- c++ - 转换后是否有一种有效的方法来使用views::filter?(范围适配器)
- java - 使用带有 Spring 和 JPA 的 Java 将电子邮件列从一个表链接到另一个表的用户名列
- javascript - 如何使用 cypress 自动进行阴性和阳性测试