如何从时间跨度中删除重叠(SQL)

时间:2017-02-02 14:53:38

标签: sql hive apache-spark-sql

我有一张相互重叠的时间跨度表。我想生成一个覆盖相同时间跨度但不重叠的表。

例如,假设我有一个这样的表:

Start,End
1,    4
3,    5
7,    8
2,    4

我想要一个像这样的新表:

Start,End
1,    5
7,    8

执行此操作的SQL查询是什么?

1 个答案:

答案 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   |
+-------+-----+