sql - 查找SQL中列值变化的时间范围
问题描述
我有一个表,其中包含 eventTime 和 status 作为列,如下所示。
eventTime status
2020-03-01 09:00 TRUE
2020-03-01 10:00 TRUE
2020-03-01 11:00 FALSE
2020-03-01 12:00 FALSE
2020-03-01 13:00 TRUE
2020-03-01 14:00 FALSE
我需要生成状态保持不变的时间范围,如下所示。
startEventTime endEventTime status
2020-03-01 09:00 2020-03-01 11:00 TRUE
2020-03-01 11:00 2020-03-01 13:00 FALSE
2020-03-01 13:00 2020-03-01 14:00 TRUE
2020-03-01 14:00 NULL FALSE
感谢是否有人可以帮助如何在查询中执行此操作?
解决方案
这是一个孤岛问题。在这个版本中,您似乎希望时代能够“平铺”而没有间隙。对于这个版本,最简单的方法可能是lag()
and lead()
:
select t.eventTime as startTime,
lead(t.eventTime) over (order by t.eventTime) as endTime,
t.status
from (select t.*,
lag(status) over (order by eventTime) as prev_status
from t
) t
where prev_status is null or prev_status <> status;
这通过获取状态更改的第一行(使用lag()
)来工作。当中间行被过滤掉时,它以结束时间为下一个开始时间。
推荐阅读
- amazon-web-services - 无法删除 Amazon RDS 实例
- spring-boot - Hikari - Spring Boot 忽略了 hikari 属性
- javascript - 如何使用 Vue/Element-UI 过滤表格
- c# - 根据对象的类型为给定对象提供特定的全局索引(C#)
- java - 类型安全的 Map 与其值的多种类型的合并;`不兼容的类型 java.lang.Object 不能转换为 capture#1 of ?`
- java - 在 SOAP Ui java 中附加多个 xml 文件
- sccm - 目前在任何服务器上都找不到该软件:sccm 问题
- php - 试图从 API 获取“非对象”的属性 - json_decode
- css - Ngbootstrap:如何在搜索输入下定位下拉菜单
- flutter - 在对话框内颤动 webview