返回最近的行键向上或向下

时间:2017-06-02 20:12:37

标签: sql sql-server

我想获得最接近或最接近下方的行返回的item_id。例如:

enter image description here

因此,如果我想要下面的行,我会输入3和1将返回。如果我想要输入3以上将返回4。

类似于:exec [myFunction] 3, 'up';

我正在研究获得最接近的相对数字(https://dba.stackexchange.com/questions/73804/how-to-retrieve-closest-value-based-on-look-up-table)。但问题是它将返回最接近的数字。如果我输入3但是下一个数字是7加1来制作4并且运行这将导致3再次。我希望这是有道理的。

然后我使用ABS功能(http://www.techfounder.net/2009/02/02/selecting-closest-values-in-mysql/)查看它。

    SELECT top 1 item_id, ABS(3) AS distance
FROM ndc
ORDER BY distance

它有类似的问题。

如何达到预期效果?

3 个答案:

答案 0 :(得分:3)

if @direction = 'up'
    begin
        select top(1) item_id from table_name
        where item_id > @inputNumber
        order by item_id asc
    end
else 
    begin
        select top(1) item_id from table_name
        where item_id < @inputNumber
        order by item_id desc
    end

答案 1 :(得分:1)

您可以将其合并到一个查询中:

select top 1 item_id
from ncd
where (item_id < @item_id and @dir = 'down') or
      (item_id > item_id and @dir = 'up')
order by (case when @dir = 'up' then item_id end) asc,
         (case when @dir = 'down' then item_id end) desc;

但我建议你使用两个查询:

select top 1 item_id
from ncd
where item_id > @item_id
order by item_id end asc;

select top 1 item_id
from ncd
where item_id < @item_id
order by item_id end desc;

然后在存储过程中使用if逻辑。这些可以更容易地利用ncd(item_id)上的索引。

答案 2 :(得分:0)

你不能只设置一个名为@UpOrDown的参数,并在where子句中输入

case when @UpOrDown = 'Above' then ITEM_ID > 3 else ITEM_ID < 3 end