如何在SQL中查找最接近给定值的最小值和最大值?

4

我有这样的表:

enter image description here

当我设置id = 4时,我需要的结果是:

enter image description here

请注意,我选择了ID=4和其两侧最近的值。
如何编写SQL代码来实现这一点?

你的ID是否总是连续的数字,没有间隔? - FDavidov
3个回答

9
你可以使用 LEAD() 函数,它按照指定的顺序选择下一个值,如下所示: 注意LEAD 仅适用于 SQL Server 2012+。
SELECT s.id,s.name,s.number
FROM (
    SELECT t.*
           LEAD(t.id,1) OVER(ORDER BY t.Number DESC) as Next_val,
           LEAD(t.id,1) OVER(ORDER BY t.Number) as Last_val
    FROM YourTable t) s
WHERE 4 IN(s.id,next_Val,s.last_val)

你可以将4替换为你想要的ID或参数。
编辑:LEAD函数提供了一种访问下一行的方法,而不需要使用SELF JOIN或sub query,它按照你在OVER()子句中提供的顺序对结果进行排序,并选择括号内的值-LEAD(value)属于正在处理的当前记录上面的记录。因此,此查询选择每个ID,以及最接近的上下值所属的ID,然后检查其中是否有你想要的ID

我想指出一个事实,即“lead”和“lag”函数是在2012版本中引入的,因为OP在他的问题中没有指定版本。此外,您的查询两次使用了“lead”,而应该使用“lead”和“lag”。 - Zohar Peled
它使用lead两次有什么关系呢?一个是按desc排序,另一个是按asc排序。我会添加一个版本说明的注释 :) - sagi
我在顶部添加了一个链接和一点解释@shahroz - sagi

0
declare @id int = 4

select sn.*
from table sn
    inner join 
    (
    select top 2 sn_prev.*
    from table sn_prev
    where id <= @id
    order by id desc
    ) sp on sp.id= sn.id

union 

select sn.*
from table sn
    inner join 
    (
    select top 1 sn_prev.*
    from table sn_prev
    where id > @id
    order by id
    ) sp on sp.id = sn.id

-1

你可以在SQL中使用MIN()和MAX()函数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接