Sql 查找表中处于最小和最大范围下的行

Sql 查找表中处于最小和最大范围下的行,sql,sql-server-2005,tsql,Sql,Sql Server 2005,Tsql,以下是此表的表和脚本 DECLARE @temp TABLE (PPId INT, SVPId INT, Minimum INT, Maximum INT) INSERT INTO @temp VALUES(1,1,8,20) INSERT INTO @temp VALUES(2,1,21,100) 最小值和最大值作为参数传入。我想找到属于给定范围的所有行 例如: 如果@最小值=9且@最大值=15 然后它落在第一个范围内 划船 如果@最小值=21和@最大值=22 然后它落在第二个范围内

以下是此表的表和脚本

DECLARE @temp TABLE (PPId INT, SVPId INT, Minimum INT, Maximum INT)

INSERT INTO @temp VALUES(1,1,8,20)
INSERT INTO @temp VALUES(2,1,21,100)

最小值和最大值作为参数传入。我想找到属于给定范围的所有行

例如:

  • 如果@最小值=9且@最大值=15 然后它落在第一个范围内 划船
  • 如果@最小值=21和@最大值=22 然后它落在第二个范围内 划船
  • 如果@最小值=7且@最大值=25 然后它落在两者的范围内 所以两行都应该返回

谢谢。

在比较这样的范围时,更容易找到范围不重叠的情况。两个范围可以有许多不同的重叠方式,但只有两种方式不重叠:

select *
from @temp
where not (@maximum < Minimum or @minimum > Maximum)
选择*
来自@temp
其中不包括(@最大值<最小值或@最小值>最大值)

在比较这样的范围时,更容易找到范围不重叠的情况。两个范围可以有许多不同的重叠方式,但只有两种方式不重叠:

select *
from @temp
where not (@maximum < Minimum or @minimum > Maximum)
选择*
来自@temp
其中不包括(@最大值<最小值或@最小值>最大值)
选择*
来自@temp
其中最小值=@min
选择*
来自@temp
其中最小值=@min

我建议的答案很简单,我怀疑我遗漏了什么或者问题不完整

SELECT *
FROM @temp
WHERE Minimum < @Minimum
    AND Maximum > @Maximum
选择*
来自@temp
其中最小值<@最小值
和最大值>@最大值

我建议的答案很简单,我怀疑我遗漏了什么或者问题不完整

SELECT *
FROM @temp
WHERE Minimum < @Minimum
    AND Maximum > @Maximum
选择*
来自@temp
其中最小值<@最小值
和最大值>@最大值

我能看到你想做什么。您想知道有多少最小/最大范围与“提供最小/最大范围”重叠。试试这个:

SELECT * FROM @temp T
WHERE  @minimum  BETWEEN T.minimum AND T.maximum
OR     @maximum  BETWEEN T.minimum AND T.maximum
OR     T.minimum BETWEEN @minimum  AND @maximum
OR     T.maximum BETWEEN @minimum  AND @maximum

这将返回与间隔[@minimum,@maximum]相交的所有行。

我可以看到您试图执行的操作。您想知道有多少最小/最大范围与“提供最小/最大范围”重叠。试试这个:

SELECT * FROM @temp T
WHERE  @minimum  BETWEEN T.minimum AND T.maximum
OR     @maximum  BETWEEN T.minimum AND T.maximum
OR     T.minimum BETWEEN @minimum  AND @maximum
OR     T.maximum BETWEEN @minimum  AND @maximum


这将返回与间隔[@最小值,@最大值]相交的所有行。

并且保证表上的范围不会重叠?是的,范围不会重叠。事实上,我这样做是为了确保这一点。为什么输入的
18 22
匹配
21 100
,而不是
8 20
?@minimum=18,@maximum=22:为什么不在第一范围内?@AakashM和@Aidan Kane,我已经编辑了我的问题。我没有意识到。桌子上的范围保证不会重叠?是的,范围不会重叠。事实上,我这样做是为了确保这一点。为什么输入的
18 22
匹配
21 100
,而不是
8 20
?@minimum=18,@maximum=22:为什么不在第一范围内?@AakashM和@Aidan Kane,我已经编辑了我的问题。我没有意识到。这将查找与@min和@max范围完全重叠的行,而不是部分重叠的行(其中@min或@max位于特定行定义的范围内)。这将查找与@min和@max范围完全重叠的行,而不是部分重叠的行(其中@min或@max位于特定行定义的范围内)有时可能需要一些人尝试去认识到这涵盖了所有的组合(部分重叠,一个范围完全在另一个范围之内/之外)。我想这是我最喜欢的回答。注意:这将最终值视为排他性而非包容性,也就是说,范围8-20和20-22不重叠。如果@min和@max都与@min=21和@max=21相同,那么它将不起作用。Quassnoi已使用非严格不等式运算符进行了修复,这使得它成为Guffa查询的真正反正。有时需要一些人尝试才能认识到这涵盖了所有的组合(部分重叠,一个范围完全在另一个范围之内/之外)。即将发布相同的内容。我认为这是我最喜欢的回答。注意:这会将结束值视为独占而不是包含,即范围8-20和20-22不会重叠。如果@min和@max都与@min=21和@max=21相同,则它将不起作用。Quassnoi已使用非严格不等式运算符=进行了修复,这将使其生效Guffa的查询的真正反面。这比其他的要长,因为我是从自己的C代码中手工挑选出来的,该代码正在寻找实际的交叉点(因此必须将其分解为每个场景)不仅仅是交叉点的布尔成功。Guffa和Quassnoi的其他选项更适合于测试交叉点是否为空。这比其他选项要长,因为我是从自己的C代码中手工挑选的,该代码正在寻找实际的交叉点(因此必须将其分解为每个场景)而且不仅仅是交叉点的布尔成功。Guffa和Quassnoi的其他选项更适合于测试交叉点是否为空。