sql - SQL选择相交区间的最小值和最大值
问题描述
在 MsSQL 2014 中,我有一个包含值区间的表
Col1 Col2
1 3
2 4
7 12
7 15
14 21
我需要得到相交区间的最大值和最小值。预期结果:
Col1 Col2
1 4
7 21
有想法如何构建查询?
第一行描述了从 1 到 3 的区间。也就是说,区间包含值 1、1.1、1.2、...、2.8、2.9、3。第二行的区间包含值 2、2.1、2.2。 ..3.9, 4. 前两行区间的交集包含 2, 2.1,...2.9, 3。
并且在第五行中,区间与从第三行开始的区间没有交集,但第五行和第三行与第四行有交集。
我需要找到这样的间隔并获得它们的最小值和最大值。我知道如何使用游标来执行此操作,但我可以使用 SQL 查询来执行此操作吗?
解决方案
这是一个空白和孤岛问题。在这种情况下,您想找到“岛屿”的起点(即之前没有重叠):
with t as (
select v.*
from (values (1, 3), (2, 4), (7, 12), (7, 15), (14, 21)
) v(col1, col2)
)
select grp, min(col1), max(col2)
from (select t.*, sum(case when prev_col2 >= col1 then 0 else 1 end) over (order by col1, col2) as grp
from (select t.*, lag(col2) over (order by col1, col2) as prev_col2
from t
) t
) t
group by grp;
这是一个 db<>fiddle。
推荐阅读
- python - GroupBy 应用 Python Pandas 的更快方法?
- atom-editor - 我是 atom (atom.io) 的新手,我已经下载了它,并且成功安装了它。但是如何打开这个编辑器呢?
- php - 无法使用php和sql更新数据库中的id值
- reactjs - 当我尝试获取 API 时如何制作加载结构?(反应.js)
- spring-boot - 部署微服务时如何在springboot中运行多个jar?
- c# - C# Rx Observable.Never<> 的行为类似于 Observable.Empty<>?
- python - 无法使用 BeautifulSoup 解析 Google 搜索结果页面
- python - 如何从python中的图像中裁剪检测到的条形码?
- microsoft-cognitive - 有没有办法提供自己的语音文件来改进自定义关键字?
- python - 如何使用派生类中的新信息覆盖基类方法?