2016-07-05 4 views
0

Wie lautet die Logik in der folgenden Abfrage, um den n-ten höchsten Wert in der Tabelle zu finden?Wie finden Sie den n-ten höchsten Wert in einer Tabelle in SQL Server

select * 
from tablename as a 
where (n-1) = (select count(distinct(column name) 
       from tablename as b 
       where b.columname > a.columnname) 

Beispiel query:

select * 
from tblperson a 
where 3 = (select count(distinct(expenses)) 
      from tblperson b 
      where b.Expenses > a.Expenses) 
+4

was ist Ihr dbms ? –

+0

Ich verwende Microsoft SQL Server – Thulasiram

+0

Markieren Sie Ihre Frage entsprechend. Sie haben es mit "SQL" markiert, was "strukturierte Abfragesprache" und nicht "SQL Server" ist. –

Antwort

1

können Sie die Funktion nutzen OFFSET FETCH Clause (SQL Server Compact):

SELECT * 
FROM tablename 
ORDER BY expenses DESC 
OFFSET N - 1 ROWS -- Nth highest (N-1 offset) 
FETCH NEXT 1 ROWS ONLY; 
+0

verzeihen Sie meine Kürze, weil ich auf meinem Handy, aber das könnte helfen. Ihre Anweisung ruft eine geordnete Liste ab, da die Liste nach Rang sortiert ist, fügen Sie einfach 'OFFSET n LIMIT 1' an und es wird ein einzelnes Element am n-ten Element in der geordneten Liste zurückgegeben, wodurch das gewünschte Ergebnis erzielt wird. –

+0

@JakePsimos, die funktionieren würden, wenn das OP mysql verwendet. Sie haben jedoch klargestellt, dass sie SQL-Server verwenden. –

+0

@JakePsimos, danke für deinen Hinweis. Meine Antwort war falsch, bitte sehen Sie mein Update, das 'OFFSET' in MS SQL. –

0

Die Abfrage sagt für jede Zeile gehen und zählen, wie viele eindeutige Werte in der Tabelle sind mit einem größerer Wert (in einer bestimmten Spalte) als der, den ich betrachte. Halten Sie nur diejenigen (Verbindungen möglich), die auf eine bestimmte Position fallen. Für den 4. Platz erwarten Sie also 3 höhere Werte.

Dies wird durch die innere Abfrage erreicht, die eine korrelierte Unterabfrage genannt wird. Obwohl der Server wahrscheinlich eine effizientere Möglichkeit hat, die Ergebnisse tatsächlich zu berechnen, können Sie sich das ähnlich wie eine Schleife mit einem Funktionsaufruf vorstellen. Die innere Abfrage wird logisch einmal für jede Zeile in der äußeren Abfrage ausgeführt und die Referenz (en) bis a darin sind für jeden dieser Läufe konstant.

Umschreiben auf diese Weise kann Ihnen helfen, zu verstehen. (Und Sie können auch die innere Abfrage selbst testen.)

select * from 
(
    select 
     a.columnname, 
     (
      select count(distinct columnname) 
      from tablename as b 
      where b.columnname > a.columnname 
     ) as NumRowsGreater 
    from tablename as a 
) as t 
where NumRowsGreater = (n-1) 
+0

Meine Zweifel hier ist, die Unterabfrage wird die Anzahl der Anzahl, von denen die WHERE-Bedingung erfüllt ist, aber wie die Hauptabfrage den maximalen Wert zurückgibt, da es nur den Wert vergleicht "where (n-1) =" – Thulasiram

+0

@ Thulasiram Ich kann deine Verwirrung nicht genau bestimmen, also kann ich es besser erklären. Studiere meine Erklärung, weil ich denke, du verstehst nicht, wie die Korrelation funktioniert. – shawnt00

0

in SQL-Server versuchen, diese

select TOP 3 * FROM tblperson order by Expenses DESC 

oder so etwas wie dies in den gespeicherten Prozeduren

select TOP @N * FROM tblperson order by Expenses DESC 
+0

Nur die N-te Zeile sollte zurückgegeben werden. –

Verwandte Themen