我想返回两个绑定值的记录的记录。因此,如果我的值为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中有一种聪明的简单方法吗?而不是两个查询?
答案 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