微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何获得查询中一行的最终长度?

如何解决如何获得查询中一行的最终长度?

我只是在学习 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 举报,一经查实,本站将立刻删除。