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

时间:2019-04-24 09:01:51

标签: sql sql-server intervals

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

2 个答案:

答案 0 :(得分: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 <>小提琴。

答案 1 :(得分:0)

这将需要自联接,因此请使用不同的别名。另外,为防止对同一行进行低/高和高/低检索,请仅将第二个别名的值设置为大于第一行的别名。也许像

manager_id