SQL选择相交间隔的最小值和最大值

问题描述 投票:0回答:2

在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查询吗?

sql sql-server intervals
2个回答
1
投票

这是一个空白和岛屿问题。在这种情况下,您想要找到“孤岛”开始的位置(之前没有重叠):

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 <>小提琴。


0
投票

它需要自联接,因此请使用不同的别名。此外,为了防止相同行的低/高和高/低检索,使第二个别名只有一个大于第一个的值......也许像

select
      low.Col1,
      hi.Col2
   from
      YourTable low
         JOIN YourTable hi
            on low.Col1 < hi.Col1
            AND hi.Col1 < low.Col2
© www.soinside.com 2019 - 2024. All rights reserved.