我有一张相互重叠的时间跨度表。我想生成一个覆盖相同时间跨度但不重叠的表。
例如,假设我有一个这样的表:
Start,End
1, 4
3, 5
7, 8
2, 4
我想要一个像这样的新表:
Start,End
1, 5
7, 8
执行此操作的SQL查询是什么?
答案 0 :(得分:1)
在spark-sql 1.5.2版本上测试过 (以及对Teradata,Oracle,PostgreSQL和SQL Server的小改动)
为了保证此解决方案的正确性,两个分析函数中的order by
子句应该是相同且确定的,因此如果您有一个Id列,则使用按“Start”,“Id”。 而不是按“开始”排序,“结束”
select min(`Start`) as `Start`
,max(`End`) as `End`
from (select `Start`,`End`
,count(is_gap) over
(
order by `Start`,`End`
rows unbounded preceding
) + 1 as range_seq
from (select `Start`,`End`
,case
when max(`End`) over
(
order by `Start`,`End`
rows between unbounded preceding
and 1 preceding
) < `Start`
then 1
end is_gap
from mytable
) t
) t
group by range_seq
order by `Start`
+-------+-----+
| Start | End |
+-------+-----+
| 1 | 5 |
+-------+-----+
| 7 | 8 |
+-------+-----+