SQL select 相交区间的最小值和最大值
SQL select the min and max values of the intersecting interval
在 MsSQL 2014 中,我有一个 table 包含值区间
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 查询来执行此操作吗?
这需要自联接,因此请使用不同的别名。此外,为了防止 low/hi 和 hi/low 检索相同的行,第二个别名的值仅大于第一个...可能类似于
select
low.Col1,
hi.Col2
from
YourTable low
JOIN YourTable hi
on low.Col1 < hi.Col1
AND hi.Col1 < low.Col2
这是一个缺口和孤岛问题。在这种情况下,您想找到 "islands" 开始的位置(之前没有重叠):
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;
Here 是一个 db<>fiddle.
在 MsSQL 2014 中,我有一个 table 包含值区间
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 查询来执行此操作吗?
这需要自联接,因此请使用不同的别名。此外,为了防止 low/hi 和 hi/low 检索相同的行,第二个别名的值仅大于第一个...可能类似于
select
low.Col1,
hi.Col2
from
YourTable low
JOIN YourTable hi
on low.Col1 < hi.Col1
AND hi.Col1 < low.Col2
这是一个缺口和孤岛问题。在这种情况下,您想找到 "islands" 开始的位置(之前没有重叠):
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;
Here 是一个 db<>fiddle.