Verwenden Sie den Offset für diesen Zweck ... wählen Sie die Erweiterung aus [dbo]. [Mitarbeiter] Reihenfolge nach Erweiterung absteigend 2 Zeilen holen nur die nächsten 1 Zeilen ab
Jinto John
Antworten:
294
SELECT MAX( col )FROMtableWHERE col <(SELECT MAX( col )FROMtable)
Die Antwort von Matt und Vinoy kümmert sich auch um Duplikate. Angenommen, der größte Wert wird wiederholt, dann ergibt die Verwendung von Matts Antwort den richtigen zweitgrößten Wert. Wenn Sie den Top-2-Desc- und Min- Ansatz verwendet haben, erhalten Sie möglicherweise stattdessen den größten Wert.
Pankaj Sharma
Was ist, wenn es mehrere zweithöchste gibt ... Dann gibt dies nicht alle Tupel
--filter out the maxselect max( col )from[table]where col <(select max( col )from[table])--sort top two then bottom oneselecttop1 col
from(selecttop2 col
from[table]orderby col) topTwo
orderby col desc
In Microsoft SQL ist der erste Weg doppelt so schnell wie der zweite, selbst wenn die betreffende Spalte gruppiert ist.
Dies liegt daran, dass der Sortiervorgang im Vergleich zu dem von der maxAggregation verwendeten Tabellen- oder Index-Scan relativ langsam ist .
Alternativ können Sie in Microsoft SQL 2005 und höher die folgende ROW_NUMBER()Funktion verwenden:
select col
from(select ROW_NUMBER()over(orderby col asc)as'rowNum', col
from[table]) withRowNum
where rowNum =2
Ich sehe hier sowohl einige SQL Server-spezifische als auch einige MySQL-spezifische Lösungen, daher möchten Sie möglicherweise klären, welche Datenbank Sie benötigen. Wenn ich raten müsste, würde ich SQL Server sagen, da dies in MySQL trivial ist.
Ich sehe auch einige Lösungen, die nicht funktionieren, weil sie die Möglichkeit von Duplikaten nicht berücksichtigen. Seien Sie also vorsichtig, welche Sie akzeptieren. Schließlich sehe ich einige, die funktionieren werden, aber zwei vollständige Scans der Tabelle durchführen. Sie möchten sicherstellen, dass beim 2. Scan nur 2 Werte angezeigt werden.
SQL Server (vor 2012):
SELECT MIN([column])AS[column]FROM(SELECTTOP2[column]FROM[Table]GROUPBY[column]ORDERBY[column]DESC) a
Das hatte ich mir erhofft zu sehen. Die akzeptierte Antwort wird hässlich, wenn Sie sie benötigen, um für eine zu arbeiten n. Dieser besteht diesen Test.
Robin Maben
@RobinMaben Robin, wie wäre es mit dem Szenario, in dem der größte Wert wiederholt wird? Angenommen, eine Spalte enthält die Nummern 1 bis 100, aber 100 wird zweimal wiederholt. Dann erzeugt diese Lösung den zweitgrößten Wert als 100, was falsch ist. Richtig?
Pankaj Sharma
1
@PankajSharma Nein, dies wird aufgrund der GROUP BY-Klausel
Joel Coehoorn
Dies ist die Standardmethode. Die akzeptierte Antwort sollte auf diese aktualisiert werden.
Guilherme Melo
1
Ich erhalte eine Fehlermeldung, dass ich nicht TOPund OFFSETin derselben Abfrage verwenden kann.
Dies ist ein sehr einfacher Code. Sie können Folgendes ausprobieren: -
Beispiel: Tabellenname = Test
salary
1000150014507500
MSSQL-Code, um den zweitgrößten Wert zu erhalten
select salary from test orderby salary desc offset 1rowsfetch next 1rows only;
Hier bedeutet "Versatz 1 Zeilen" die 2. Tabellenzeile und "Nur die nächsten 1 Zeilen abrufen", um nur diese 1 Zeile anzuzeigen. Wenn Sie nicht "Nur die nächsten 1 Zeilen abrufen" verwenden, werden alle Zeilen aus der zweiten Zeile angezeigt.
Tom, glaube, dies wird fehlschlagen, wenn mehr als ein Wert im select max([COLUMN_NAME]) from [TABLE_NAME]Abschnitt zurückgegeben wird. dh wenn der Datensatz mehr als 2 Werte enthält.
Eine geringfügige Änderung Ihrer Abfrage funktioniert -
Antworten:
quelle
quelle
In T-Sql gibt es zwei Möglichkeiten:
In Microsoft SQL ist der erste Weg doppelt so schnell wie der zweite, selbst wenn die betreffende Spalte gruppiert ist.
Dies liegt daran, dass der Sortiervorgang im Vergleich zu dem von der
max
Aggregation verwendeten Tabellen- oder Index-Scan relativ langsam ist .Alternativ können Sie in Microsoft SQL 2005 und höher die folgende
ROW_NUMBER()
Funktion verwenden:quelle
Ich sehe hier sowohl einige SQL Server-spezifische als auch einige MySQL-spezifische Lösungen, daher möchten Sie möglicherweise klären, welche Datenbank Sie benötigen. Wenn ich raten müsste, würde ich SQL Server sagen, da dies in MySQL trivial ist.
Ich sehe auch einige Lösungen, die nicht funktionieren, weil sie die Möglichkeit von Duplikaten nicht berücksichtigen. Seien Sie also vorsichtig, welche Sie akzeptieren. Schließlich sehe ich einige, die funktionieren werden, aber zwei vollständige Scans der Tabelle durchführen. Sie möchten sicherstellen, dass beim 2. Scan nur 2 Werte angezeigt werden.
SQL Server (vor 2012):
MySQL:
Aktualisieren:
SQL Server 2012 unterstützt jetzt eine viel sauberere (und standardmäßige ) OFFSET / FETCH-Syntax:
quelle
n
. Dieser besteht diesen Test.TOP
undOFFSET
in derselben Abfrage verwenden kann.Ich nehme an, Sie können so etwas tun:
oder
abhängig von Ihrem Datenbankserver. Hinweis: SQL Server führt kein LIMIT aus.
quelle
OFFSET 2
Am einfachsten wäre es, den zweiten Wert aus dieser Ergebnismenge in der Anwendung zu erhalten:
Wenn Sie jedoch den zweiten Wert mithilfe von SQL auswählen müssen, wie wäre es mit:
quelle
LIMIT
ist MySQL-Syntax, die Frage gibt keine SQL-Version an.Mit der folgenden Abfrage können Sie den zweitgrößten Wert der Spalte ermitteln
Weitere Details finden Sie unter folgendem Link
http://www.abhishekbpatel.com/2012/12/how-to-get-nth-maximum-and-minimun.html
quelle
Eine sehr einfache Abfrage, um den zweitgrößten Wert zu finden
quelle
MSSQL
MySQL
Keine Unterabfragen erforderlich ... überspringen Sie einfach eine Zeile und wählen Sie die zweite Zeile nach der Reihenfolge absteigend aus
quelle
Diese Abfrage gibt das maximale Gehalt aus dem Ergebnis zurück, das kein maximales Gehalt aus der Gesamttabelle enthält.
quelle
Alte Frage, die ich kenne, aber das gab mir einen besseren Ausführungsplan:
quelle
Dies ist ein sehr einfacher Code. Sie können Folgendes ausprobieren: -
Beispiel: Tabellenname = Test
MSSQL-Code, um den zweitgrößten Wert zu erhalten
Hier bedeutet "Versatz 1 Zeilen" die 2. Tabellenzeile und "Nur die nächsten 1 Zeilen abrufen", um nur diese 1 Zeile anzuzeigen. Wenn Sie nicht "Nur die nächsten 1 Zeilen abrufen" verwenden, werden alle Zeilen aus der zweiten Zeile angezeigt.
quelle
Hoffe diese Hilfe, um den Wert für jede Zeile zu erhalten .....
quelle
Am einfachsten von allen
quelle
Hinweis
sal ist col name
emp ist tabellenname
quelle
Tom, glaube, dies wird fehlschlagen, wenn mehr als ein Wert im
select max([COLUMN_NAME]) from [TABLE_NAME]
Abschnitt zurückgegeben wird. dh wenn der Datensatz mehr als 2 Werte enthält.Eine geringfügige Änderung Ihrer Abfrage funktioniert -
quelle
Die Unterabfrage gibt alle anderen Werte als den größten zurück. Wählen Sie den Maximalwert aus der zurückgegebenen Liste.
quelle
quelle
quelle
Es ist der esiest Weg:
quelle
quelle
Wie Sie bereits erwähnt haben, doppelte Werte. In diesem Fall können Sie DISTINCT und GROUP BY verwenden , um den zweithöchsten Wert zu ermitteln
Hier ist eine Tabelle
::
Erster Teil von LIMIT = Startindex
Zweiter Teil von LIMIT = wie viele Werte
quelle
Dies gibt den dritthöchsten Wert von emp table zurück
quelle
nicht in ist eine Bedingung, die den höchsten Wert von column_name ausschließt.
Referenz: Programmiererinterview
quelle
Etwas wie das? Ich habe es jedoch nicht getestet:
quelle
Siehe Auswählen der n-ten Zeile in einer SQL-Datenbanktabelle. .
Sybase SQL Anywhere unterstützt:
quelle
Verwenden einer korrelierten Abfrage:
quelle
Diese Abfrage wählt die maximal drei Gehälter aus. Wenn zwei Mitarbeiter das gleiche Gehalt erhalten, hat dies keine Auswirkungen auf die Abfrage.
quelle
quelle
Dies funktioniert in MS SQL:
quelle