查找由值限定的SQL记录

时间:2014-01-21 12:31:12

标签: sql sql-server tsql

我想返回两个绑定值的记录的记录。因此,如果我的值为120,则它位于两个100和200的记录之间。问题变成了如何最好地引入前两个记录。我已尝试过这些问题,但它会导致问题,因为定义范围的bin大小不均匀。

所以记录属于以下类型:

Value    ID
0        0
50       1
100      2
200      3
300      4

因此,如果我正在寻找数字120的边界,那么通过使用以下代码,我可以生成:

DECLARE @Actual_Value int;
@Actual_Value = 120

SELECT TOP 2 * FROM table 
WHERE XX in YY and ZZ in AA
ORDER BY ABS( Table_Values - @Actual_Value )

然后我得到以下内容:

50和100

而不是100和200,这是逻辑和正确的,因为不均匀的bin大小。不,我可以在两次传递中执行此操作,但是只有一种方法可以在一个查询中执行此操作。即以下作品:

SELECT TOP 1 * FROM table 
WHERE XX in YY and ZZ in AA and Table_Values > @Actual_Value
ORDER BY ABS( Table_Values - @Actual_Value )

SELECT TOP 1 * FROM table 
WHERE XX in YY and ZZ in AA and Table_Values < @Actual_Value
ORDER BY ABS( Table_Values - @Actual_Value )

在SQL中有一种聪明的简单方法吗?而不是两个查询?

3 个答案:

答案 0 :(得分:0)

abs(50-120) = 70小于abs(200-120) = 80
尝试这样的事情:

with ins as (
select * 
     , ROW_NUMBER() over (partition by sign(table_value-@actual_value) order by abs(table_value-@actual_value)) as cand
from   table_name
where  xx in yy and zz in aa
)
select *
  from ins
 where cand = 1

答案 1 :(得分:0)

在sqlserver 2012中:

SELECT value,next FROM
(SELECT value, LEAD(value,1) OVER(ORDER BY value) next FROM table) t
WHERE @Actual_Value BETWEEN value AND next

答案 2 :(得分:0)

你可以制作&#34; bin尺寸&#34;例如,通过使用秩函数连续,并使用自连接,检测2个连续的区间,如下所示:

SELECT a.value, b.value FROM 
(
(SELECT value, RANK() OVER (ORDER BY value) RANK FROM table) a 
JOIN (SELECT value, RANK() OVER (ORDER BY value) RANK FROM table) b 
ON a.rank=b.rank-1
) WHERE @Actual_Value BETWEEN a.value AND b.value