如何使用Presto SQL查询与指定时间窗口存在重叠的记录
Presto 时间区间重叠查询实现
核心判断逻辑
两个时间区间存在重叠的通用判断规则为:区间A的开始时间早于区间B的结束时间,且区间A的结束时间晚于区间B的开始时间。针对本题end_timestamp为NULL代表进程仍在运行的场景,对规则做适配:
- 若进程结束时间为NULL,等价于进程结束时间为无穷大,只要进程开始时间早于查询窗口结束时间即满足重叠的必要条件
- 只要两个区间有1秒重合就会命中,符合业务要求
可直接运行的SQL代码
-- 先定义查询时间窗口,修改此处的时间值即可调整查询范围 WITH query_window AS ( SELECT TIMESTAMP '2021-07-13 00:00:00' AS window_start, TIMESTAMP '2021-07-13 04:30:00' AS window_end ) SELECT Id FROM your_table_name, query_window WHERE -- 进程开始时间早于查询窗口结束时间 start_timestamp < window_end AND ( -- 进程结束时间晚于查询窗口开始时间,或者进程仍在运行 end_timestamp > window_start OR end_timestamp IS NULL )
适配说明
- 把SQL中的
your_table_name替换为你的实际表名即可使用 - 若需要返回完整的进程记录,把
SELECT Id改为SELECT your_table_name.*即可 - 若业务要求时间点完全重合也视为重叠,可将
</>替换为<=/>=,判断逻辑依然生效
内容的提问来源于stack exchange,提问作者Slava
相关产品推荐
相关产品推荐

