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扩展用于我可以使用的问题吗?
答案 0 :(得分:2)
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);