You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL如何简洁获取不重叠的最长独立日期范围?

问题

我需要在PostgreSQL的一张表中实现逻辑,返回不重复的最长日期范围。示例数据里,PKID 1的日期范围完全包含了PKID 2-4的范围,PKID 5是一个独立的范围,最终要返回的就是PKID 1和5。我不想用多个MIN()、MAX()聚合函数、时长比较,也不想写10行带LAG()的CASE语句来实现,有没有更简便的方法?我找过几个类似问题,但都不完全匹配;我知道PostgreSQL的OVERLAP函数,但还没想明白怎么用在这个场景里。

示例数据说明:高亮行是需要返回的目标行(对应PKID 1和5)

解决方案

用NOT EXISTS子查询可以一步到位,直接筛选出未被其他任何日期范围完全包含的记录,完全符合你的需求:

SELECT pkid, start_date, end_date
FROM date_ranges dr
WHERE NOT EXISTS (
    SELECT 1
    FROM date_ranges dr2
    WHERE dr2.pkid != dr.pkid
      AND dr2.start_date <= dr.start_date
      AND dr2.end_date >= dr.end_date
);

逻辑说明

  • 子查询会检查是否存在其他行(排除自身)的日期范围完全覆盖当前行:如果存在,说明当前行是被包含的小范围,直接排除;如果不存在,说明当前行是独立或最大的范围,保留。
  • 若你的业务中日期范围是半开区间(比如end_date为排他值),只需把>=改成>、<=改成<即可适配。

内容的提问来源于stack exchange,提问作者plankton

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 21:41:15