在 Oracle 中对重叠的时间间隔进行分组
Posted
技术标签:
【中文标题】在 Oracle 中对重叠的时间间隔进行分组【英文标题】:Grouping overlapping time intervals in Oracle 【发布时间】:2015-11-26 20:30:27 【问题描述】:在 Oracle 10g 中有一个包含 date_from
和 date_to
列的数据集(或者更确切地说只是 date_from
,因为长度是恒定的)。
我需要折叠重叠的间隔,例如这些行:
date_from date_to
2015-01-01 2015-01-10
2015-01-03 2015-01-11
需要成为:
2015-01-01 2015-01-11
我想知道是否有一种方法可以在不使用游标的情况下一次性整齐地查询...我的查询很大,并且在边缘情况下仍然不会折叠所有内容。也许 Oracle 10g 中有一些 SQL 扩展可以解决我可以使用的此类问题?
【问题讨论】:
【参考方案1】:WITH data (date_from, date_to) AS (
SELECT DATE'2015-01-01', DATE'2015-01-10' FROM DUAL UNION ALL
SELECT DATE'2015-01-03', DATE'2015-01-11' FROM DUAL
)
SELECT
min(date_from) date_from, max(date_to) date_to
FROM (
SELECT
date_from, date_to,
sum(merge) OVER (ORDER BY date_from) group_id
FROM (
SELECT
date_from, date_to,
case when date_from <= lag(date_to) OVER (ORDER BY date_from)
THEN 0
ELSE 1
end as merge
FROM data)
) intervals
GROUP BY group_id
ORDER BY min(intervals.date_from);
【讨论】:
这是什么魔法?!非常感谢,LAG() OVER()
是我一直在寻找的。span>
以上是关于在 Oracle 中对重叠的时间间隔进行分组的主要内容,如果未能解决你的问题,请参考以下文章
如何在postgres中对几个月的日期记录分组后填补时间间隔
如何在 Oracle SQL 上进行查询以获取时间间隔,按特定字段分组