sql - 在 PostgreSQL 中将重叠的间隔分割成较小的、接触的间隔

标签 sql postgresql

我需要有关查询的帮助,该查询应按以下方式分割一些重叠的日期间隔。

例如,如果我们有下表

----------------------------------------------------------------------
|   column_name    |    value    |    start_date    |    end_date    |
----------------------------------------------------------------------
|     column1      |    value1   |    03-09-2020    |   26-09-2020   |
----------------------------------------------------------------------
|     column1      |    value2   |    07-09-2020    |   20-09-2020   |
----------------------------------------------------------------------

我在提出查询以生成以下输出时遇到问题:

----------------------------------------------------------------------
|   column_name    |    value    |    start_date    |    end_date    |
----------------------------------------------------------------------
|     column1      |    value1   |    03-09-2020    |   07-09-2020   |
----------------------------------------------------------------------
|     column1      |    value2   |    07-09-2020    |   20-09-2020   |
----------------------------------------------------------------------
|     column1      |    value1   |    20-09-2020    |   26-09-2020   |
----------------------------------------------------------------------

最佳答案

一种方法是获取所有日期并使用横向连接来计算该日期的值:

with dates as (
      select start_date as date
      from t
      union 
      select end_date
      from t
     )
select tt.value, d.date as start_date, lead(d.date) over (order by d.date) as end_date
from dates d left join lateral
     (select t.*
      from t
      where start_date <= d.date and
            end_date > d.date
      order by start_date desc  -- this gets the most recent overlapping value
      limit 1
     ) tt
     on true
order by d.date;

Here是一个数据库<> fiddle 。

请注意,这会添加一个额外的行,其中包含最后的“无值”句点。如果您不需要,可以轻松过滤掉它。

关于sql - 在 PostgreSQL 中将重叠的间隔分割成较小的、接触的间隔,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64608335/

相关文章:

mysql - 结果集的排序

postgresql - 仅选择 postgres 中具有最新日期的行

跨多个地理位置共享的 Postgresql 数据库

sql - 我怎样才能得到重叠值的计数并按最重叠的百分比排序

MySQL 连接两个表

python - Pandas 数据帧 to_sql 数据长度超过 65536 个字符

sql - MongoDB中地理空间索引的内部机制

php - Mysqli - 如何构建查询?

python - 为什么我没有从使用编码数据库中得到 SQL 查询的结果?

sql - 如何在没有级联的情况下从postgresql表中删除行