确定糟糕的标题,但我有一个表格,条件之间是行。
id | Value | ValueMax
1 0 49000
2 50000 70000
简单的部分是比较一个值并返回其中一行。中断的部分是,如果它超过ValueMax,在这种情况下是70000,它应该返回该行。但是简单的条件x> ValueMax也满足另一行,并返回两者。我错过了什么
答案 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);