【问题标题】:SQL select the min and max values of the intersecting intervalSQL选择相交区间的最小值和最大值
【发布时间】:2019-04-24 19:23:11
【问题描述】:

在 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


【解决方案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 是一个 dbfiddle。

【讨论】:

    【解决方案2】:

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

    select
          low.Col1,
          hi.Col2
       from
          YourTable low
             JOIN YourTable hi
                on low.Col1 < hi.Col1
                AND hi.Col1 < low.Col2
    

    【讨论】:

      猜你喜欢
      • 2020-05-16
      • 1970-01-01
      • 2019-02-09
      • 2021-04-25
      • 2014-12-01
      • 1970-01-01
      • 2015-02-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多