首页 > 解决方案 > 查找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

感谢是否有人可以帮助如何在查询中执行此操作?

标签: sql

解决方案


这是一个孤岛问题。在这个版本中,您似乎希望时代能够“平铺”而没有间隙。对于这个版本,最简单的方法可能是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())来工作。当中间行被过滤掉时,它以结束时间为下一个开始时间。


推荐阅读