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

noj0wjuj  于 2021-06-26  发布在  Hive
关注(0)|答案(1)|浏览(459)

我有一张相互重叠的时间跨度表。我想生成一个覆盖相同时间跨度但不重叠的表。
例如,假设我有这样一个表:

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

我想要一张这样的新table:

Start,End
1,    5
7,    8

sql查询是如何做到这一点的?

kokeuurv

kokeuurv1#

在spark sql 1.5.2版上测试。
(在teradata、oracle、postgresql和sql server上做了一些小改动)
为了保证这个解决方案的正确性 order by 两个分析函数中的子句应该是相同的和确定的,因此如果您有一个id列,请使用order by'start','id',而不是order by'start','end`

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

相关问题