J'ai une table comme celle-ci:
Quand je mets id = 4, les résultats dont j'ai besoin sont:
Notez que j'ai sélectionné l' ID=4
et les deux valeurs les plus proches des deux côtés.
Comment écrire du code sql pour le faire?
Vous pouvez utiliser la fonction LEAD()
, qui sélectionne la prochaine valeur par un ordre spécifique, comme ceci:
Notez que LEAD
n'a été introduit que dans 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)
Vous pouvez replace 4
avec votre ID
désiré ou avec un paramètre.
EDIT: Une petite explication – La fonction LEAD
fournit un moyen d'accéder à la ligne suivante, sans l'utilisation d'un SELF JOIN
ou une sub query
, il ordonne les résultats par l'ordre que vous avez fourni dans la clause OVER()
, et select la valeur les parenthèses – LEAD(value)
qui appartiennent à l'logging au-dessus de l'logging en cours en cours de traitement. Ainsi, cette requête sélectionne chaque ID
, et l' ID
qui appartient à la valeur la plus proche de haut en bas, puis vérifiez si l'un d'entre eux est votre ID
désiré.
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
vous pouvez utiliser la fonction MIN () et MAX () en SQL.