SQL 递归 cte - 对重叠范围进行排序

问题描述 投票:0回答:1

我有一张如下所示的桌子

range_from range_end created_on
100 105 2023-01-01
106 110 2023-01-01
106 111 2023-06-01
120 130 2023-01-01
112 130 2023-06-01

我需要清理它以获得最新的且不重叠的表格。

结果应该是这样的

range_from range_end created_on
100 105 2023-01-01
106 111 2023-06-01
112 130 2023-06-01

我遇到的问题是我不知道如何让循环在“where”之后继续运行,也不知道如何删除 select 语句下的行。 我的代码是:

with recursive bin_range as (
        select bin_from, bin_end, created_on,
                       row_number() over(order by bin_from) rownum,
                from raw_BIN
                qualify rownum =1
  
         union all

        select v.bin_from, v.bin_end, v.created_on, 
               v.rownum
                from bin_range B
                join ( select bin_from, bin_end, created_on,
                        row_number() over(order by bin_from) rownum,
                         from raw_BIN
                )V on B.rownum +1 = V.rownum
        where v.bin_from < b.bin_end
)
select * from bin_range;

非常感谢!

sql common-table-expression recursive-cte
1个回答
1
投票

你不需要递归 cte :

SELECT *
FROM raw_BIN t1
WHERE EXISTS (
    SELECT *
    FROM raw_BIN t2
    WHERE (t1.range_from <> t2.range_from OR t1.range_end <> t2.range_end)
    AND t1.range_from BETWEEN t2.range_from AND t2.range_end
    AND t1.range_end BETWEEN t2.range_from AND t2.range_end
);
© www.soinside.com 2019 - 2024. All rights reserved.