sql - 如何从查询输出中删除具有开始和结束时间戳的部分/完全重叠事件?

标签 sql postgresql

我有一个表events,其中包含很多重叠的事件。例如,表 events 中的以下行与其他行完全或部分重叠:

id  start                   end                     created_at
1   2019-01-23 18:30:00.0   2019-01-23 19:00:00.0   2019-01-18 21:28:27.427612
2   2019-01-23 18:30:00.0   2019-01-23 19:00:00.0   2019-01-23 01:04:05.861876
3   2019-01-23 18:00:00.0   2019-01-23 18:45:00.0   2019-01-16 17:14:50.709552
4   2019-01-23 18:30:00.0   2019-01-23 19:30:00.0   2019-01-22 19:24:05.532491
5   2019-01-23 18:30:00.0   2019-01-23 19:30:00.0   2019-01-18 17:28:40.074205
6   2019-01-23 20:00:00.0   2019-01-23 20:30:00.0   2019-01-18 15:22:30.736888
7   2019-01-23 20:15:00.0   2019-01-23 20:45:00.0   2019-01-20 20:20:20.202020

在这种情况下,我需要做的是使整个重叠时间 block 中的一次 session 具有最新的 created_at 值。

id  start                   end                     created_at
2   2019-01-23 18:30:00.0   2019-01-23 19:00:00.0   2019-01-23 01:04:05.861876
7   2019-01-23 20:15:00.0   2019-01-23 20:45:00.0   2019-01-20 20:20:20.202020

我四处寻找可以处理表格中出现的任意数量的此类重叠的答案,但还没有找到任何可行的方法。

最佳答案

这是一种间隙和孤岛的形式。在这种情况下,通过在开始处寻找重叠来确定岛屿的开始位置。然后,对开始和聚合进行累加和:

select max(id), min(start), max(end), max(created_at)
from (select t.*,
             count(*) filter (where max_end < end) over (order by start) as grouping
      from (select t.*,
                   max(end) over (order by start rows between unbounded preceding and 1 preceding) as max_end
            from events t
           ) t
     ) t
group by grouping;

关于sql - 如何从查询输出中删除具有开始和结束时间戳的部分/完全重叠事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57045858/

相关文章:

c# - 使用纬度/经度计算最近点的距离?

sql - 数千个值的 Redshift IN 条件

postgresql - 如何使用 rowtype 数组作为 Java 参数调用 PostgreSQL 函数

java - Caused by : org. hibernate.MappingException: 实体映射中的重复列

python - 当详细信息肯定在数据库中时,验证电子邮件和散列密码总是返回 None

sql - 从 postgreSQL 中的过滤结果中选择记录

mysql - SQL查询以查找ID在另一列中不存在的位置

Mysql 像描述的那样对我的表中的数据进行排序

Javascript SQLite : SELECT statement with WHERE IN clause

postgresql - 月份和年份而不是日期变量