如何解决如何获得查询中一行的最终长度?
我只是在学习 sql,我有一个任务,当我输入如下时,我需要找到不连续线的最终长度:
start | finish
0 | 3
2 | 7
15 | 17
这里的正确答案是 9,因为它跨越 0-3,然后我可以忽略从 3-7 多次出现的部分(忽略这两个,因为它已经在 0 到 3 之间) ) 和 15-17。我应该仅通过 sql 查询(无函数)获得此答案,但我不确定如何。我曾尝试使用 with 来试验一些代码,但我终生无法弄清楚如何正确忽略所有倍数。 我的半个尝试:
WITH temp AS(
SELECT s as l,f as r FROM lines LIMIT 1),cte as(
select s,f from lines where s < (select l from temp) or f > (select r from temp)
)
select * from cte
这实际上只给了我所有并非完全无用的行并延长了长度,但我不知道从这里开始做什么。
解决方法
使用递归 CTE
将所有 (start,finish)
区间分解为与区间总长度一样多的 1 个单位 长度区间,然后计算所有不同的区间:
WITH cte AS (
SELECT start x1,start + 1 x2,finish FROM temp
WHERE start < finish -- you can omit this if start < finish is always true
UNION
SELECT x2,x2 + 1,finish FROM cte
WHERE x2 + 1 <= finish
)
SELECT COUNT(DISTINCT x1) length
FROM cte
参见demo。
结果:
长度 |
---|
9 |
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。