mysql - 如何在 MYSQL 中获取打开和关闭时隙
问题描述
我有这样的样本数据:
ID Val Name Dt Status
1, 145, 'Test1', '2020-01-28 02:18:00', 'open'
2, 145, 'Test1', '2020-01-28 04:10:00', 'open'
3, 145, 'Test1', '2020-01-28 05:50:00', 'open'
4, 145, 'Test1', '2020-01-28 05:56:00', 'close'
5, 145, 'Test2', '2020-01-28 07:36:00', 'open'
6, 145, 'Test2', '2020-01-28 07:42:00', 'open'
7, 145, 'Test2', '2020-01-28 07:44:00', 'open'
8, 145, 'Test2', '2020-01-28 07:47:00', 'close'
我怎样才能得到这样的输出:
ID Val Name o_Dt o_gate c_Dt c_gate
1, 145, 'Test1', '2020-01-28 02:18:00', 'open' NULL NULL
2, 145, 'Test1', '2020-01-28 04:10:00', 'open' NULL NULL
3, 145, 'Test1', '2020-01-28 05:50:00', 'open' '2020-01-28 05:56:00', 'close'
4, 145, 'Test2', '2020-01-28 07:36:00', 'open' NULL NULL
5, 145, 'Test2', '2020-01-28 07:42:00', 'open' NULL NULL
6, 145, 'Test2', '2020-01-28 07:44:00', 'open' '2020-01-28 07:47:00', 'close'
我尝试过不同的场景,但没有继续使用
COALESCE(LAG(Status) OVER (ORDER BY dt)
ROW_NUMBER()OVER(PARTITION BY vehicle_id,status )
没有得到确切的结果。任何人都可以对此提出建议。
以前我问过相同数据的问题,但没有得到确切的答案。
解决方案
SELECT t1.ID, t1.Val, t1.Name, t1.Dt o_Dt, t1.Status o_gate, t2.Dt c_Dt, t2.Status c_gate
FROM test t1
LEFT JOIN test t2 ON t1.Dt < t2.Dt
AND t1.Name = t2.Name
AND t2.Status = 'close'
AND NOT EXISTS ( SELECT NULL
FROM test t3
WHERE t1.Dt < t3.Dt
AND t3.Dt < t2.Dt
AND t1.Name = t3.Name)
WHERE t1.Status = 'open'
推荐阅读
- laravel - 如何修改时间戳列?
- angular - 订购/过滤时 Kendo UI 网格选择不正确
- javascript - 使用单击 EventListener 更改活动选项卡,如何在重新加载页面时添加默认活动选项卡?
- python - 了解时间序列数据上的傅里叶变换组件
- discord.py - 在重新启动会话之前获取机器人发送的消息
- python - 有没有办法从 SQLAlchemy 对象中获取引擎?
- jupyter-notebook - Jupyterhub 每个选项卡多个会话
- java - 向前看非数字字符
- c++ - 使用 PKCS#11 中的智能卡私钥签署证书请求
- python - 无法打开从 request.files.get() 获取的图像文件