2016-08-10 1 views

Antwort

8

können Sie verwenden LEAD() Funktion, die den nächsten Wert von einer bestimmten Reihenfolge, wie dies wählt:

Hinweis dass LEAD nur für SQL-Server 2012+ vorgestellt wurde.

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) 

Sie können ersetzen 4 mit Ihrem ID oder mit einem Parameter gewünscht.

EDIT: Eine kleine Erklärung - LEAD-Funktion ermöglicht es, die nächste Zeile zuzugreifen, ohne die Verwendung eines SELF JOIN oder sub query, es die Ergebnisse durch die Reihenfolge anordnet Sie innerhalb der OVER() Klausel vorgesehen, und wählen Sie die Wert innerhalb der Klammern - LEAD(value), die zu dem Datensatz oberhalb des aktuellen Datensatzes gehören, der verarbeitet wird. Also, diese Abfrage wählt jede ID, und die ID, die zu den nächsten Wert nach oben und unten gehört, und dann prüfen, ob einer von ihnen ist Ihre gewünschte ID.

+0

Ich möchte darauf hinweisen, dass die Funktionen "Lead" und "Lag" in der Version 2012 eingeführt wurden, da das OP die Version in seiner Frage nicht angegeben hat. Außerdem verwendet Ihre Abfrage zweimal "Lead", wenn "Lead" und "Lag" verwendet werden sollen. –

+0

Was ist es wichtig, wenn es 'Lead' zweimal verwendet? Einer ist mit 'desc' und einer mit' asc' bestellt .. Ich werde eine Notiz über die Version hinzufügen :) – sagi

+0

Entschuldigung, ich habe das DESC nicht dort gesehen ... –

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

Sie können MIN() und MAX() Funktion in SQL verwenden.

Verwandte Themen