【问题标题】:distinct intervals for overlapping date ranges sql重叠日期范围sql的不同间隔
【发布时间】:2021-11-18 21:10:58
【问题描述】:

我已经看到很多关于如何合并多个日期范围的查询 - 但是否有一个简单的查询来确定所有的时间间隔?

例如

start           end
2010-01-01      2010-01-31
2010-01-10      2010-02-10

我想显示所有不同的间隔 即

start           end
2010-01-01      2010-01-09
2010-01-10      2010-01-31
2010-02-01      2010-02-10

以上示例适用于 2 个日期范围 - 理想情况下,结果应适用于 n 个日期范围

【问题讨论】:

    标签: sql postgresql


    【解决方案1】:

    检查以下代码。

    首先展平开始和结束,并为它们每个添加“级别”。 级别是当时重叠范围的数量。 然后为每一行生成当前日期和 rext 日期之间的时间范围, 省略 level = 0 的行

    with
    a as (
      select "start" as date, 'S' as type from TBL
      union
      select "end" as date, 'E' as type from TBL
    ),
    b as (
      select 
        date,
        sum(case when type = 'S' then 1 else -1 end)
            over(order by date
                 rows between unbounded preceding and current row) as level,
        lead(date) over (order by  date) as next_date
      from a
    )
    select 
        date as start,
        (next_date - 1) as end
    from b
    where level > 0 // out of range
      and date <> next_date
    

    运行这个:
    https://www.db-fiddle.com/f/rgfTsAamaoujRaQy9FLtnQ/1

    【讨论】:

    • 感谢番茄酱。这给了我一些东西来解决我的问题
    猜你喜欢
    • 1970-01-01
    • 2018-03-03
    • 2022-01-25
    • 2019-08-16
    • 2020-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-31
    相关资源
    最近更新 更多