首页 > 解决方案 > 如何确保sql结果是连续范围?

问题描述

我有这样的表:

id   | low_number | high_number
-------------------------------
1    |  12        | 32
-------------------------------
2    |  13        | 33
-------------------------------
3    |   15       | 36
-------------------------------
4    |   33       |  50 
-------------------------------
5    |   35       | 52
...
-------------------------------
17   |   52       |  80

我想得到如下结果:

id   | low_number | high_number
-------------------------------
1    |  12        | 32
-------------------------------
4    |   33       |  50 
-------------------------------
17   |   52       |   80

这是因为 low_number 大于前一行 high_number。

如何编写 sql 来获得这些结果?我用postgresql

标签: sqlpostgresql

解决方案


这似乎是一个递归 CTE 问题。您想选择第一行(按 id),然后根据它选择下一行。

这个想法是循环遍历行,一次一个。然后当满足条件时,转换到该行。等等。

作为查询,这看起来像:

with recursive tt as (
      select id, low_number, high_number, row_number() over (order by id) as seqnum
      from t
     ),
     cte as (
      select id, low_number, high_number, seqnum, true as is_change, id as grouping_id
      from tt
      where seqnum = 1
      union all
      select tt.id, tt.low_number, tt.high_number, tt.seqnum, tt.low_number > t.high_number,
             (case when tt.low_number > t.high_number then tt.id else cte.grouping_id end)
      from cte join
           t
           on cte.grouping_id = t.id join
           tt
           on tt.seqnum = cte.seqnum + 1
     )
select *
from cte
where is_change;

是一个 db<>fiddle。


推荐阅读