sql - 如何确保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
解决方案
这似乎是一个递归 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。
推荐阅读
- winforms - 仅当部署在 Windows 10 机器上时,什么会导致图像列上的数据网格错误?
- javascript - 在关闭应用程序/标签之前,R闪亮询问确认
- amazon-web-services - s3 错误:无法验证以下目标配置。无权调用函数
- java - 扩展是正确的方法吗?
- c# - Azure MySql 异常:连接字符串可能不正确。请访问门户以获取参考
- javascript - QWebEngine 的 CORS 问题:可能的“Origin”值是否有限制?
- angular - 不明白为什么这个布尔比较失败
- swift - NSMutableAttributedString: 'init(string:attributes:)' 的模糊使用
- doctrine-orm - Symfony 4:通过反序列化实体更新现有实体最终会得到一个新的相关项或 ORMInvalidArgumentException
- google-api - 使用 GTM API v2 创建在 {{variable}} == 'false' 时触发的 Google 跟踪代码管理器触发器