SQL根据行值获取条件

时间:2016-04-12 19:06:16

标签: sql sql-server sql-server-2008

确定糟糕的标题,但我有一个表格,条件之间是行。

id  | Value |  ValueMax
 1        0       49000
 2    50000       70000  

简单的部分是比较一个值并返回其中一行。中断的部分是,如果它超过ValueMax,在这种情况下是70000,它应该返回该行。但是简单的条件x> ValueMax也满足另一行,并返回两者。我错过了什么

3 个答案:

答案 0 :(得分:2)

忽略ValueMax,然后使用ValueMin。在ANSI SQL中:

select t.*
from t
where @x >= ValueMin
order by ValueMin desc
fetch first 1 row only;

不同的数据库有不同的拼写方式"只获取前1行&#34 ;;有些使用limit,有些使用top,有些使用rownum,有些甚至支持此ANSI语法。

答案 1 :(得分:0)

试试这个:

SELECT Id, Value, ValueMax
FROM mytable
WHERE @x BETWEEN Value AND ValueMax

UNION

SELECT Id, Value, ValueMax
FROM mytable
WHERE ValueMax = (SELECT MAX(ValueMax) FROM mytable) AND   
      NOT EXISTS (SELECT 1
                  FROM mytable
                  WHERE @x BETWEEN Value AND ValueMax)

答案 2 :(得分:0)

您正在冗余地存储数据,因为ValueMax始终是下一个记录的值减1.您可以在查询中计算ValueMax:

select
  value,
  lead(value) over (order by value) - 1 as valuemax
from mytable;

这甚至可以纠正最后一条记录,现在为“无限制”而不是某个错误的数字(在您的示例中为70000)获取空值。

此查询可以相应地为您获取值@x的正确记录:

select value, valuemax
from
(
  select
    value,
    lead(value) over (order by value) - 1 as valuemax
  from mytable
) values
where @x between value and coalesce(valuemax, @x);

您可以从表中删除ValueMax。它如图所示是多余的,因此不需要。

如果你想保留这个列是为了方便,那么你应该把最后一个值设置为null(为什么它必须被忽略时才是70000)?这会将查询简化为:

select value, valuemax
from mytable
where @x between value and coalesce(valuemax, @x);