Was ist die einfachste SQL-Abfrage, um den zweitgrößten ganzzahligen Wert in einer bestimmten Spalte zu finden?
Die Spalte enthält möglicherweise doppelte Werte.
Was ist die einfachste SQL-Abfrage, um den zweitgrößten ganzzahligen Wert in einer bestimmten Spalte zu finden?
Die Spalte enthält möglicherweise doppelte Werte.
Antworten:
SELECT MAX( col )
FROM table
WHERE col < ( SELECT MAX( col )
FROM table )
In T-Sql gibt es zwei Möglichkeiten:
--filter out the max
select max( col )
from [table]
where col < (
select max( col )
from [table] )
--sort top two then bottom one
select top 1 col
from (
select top 2 col
from [table]
order by col) topTwo
order by 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 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:
select col
from (
select ROW_NUMBER() over (order by 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 (
SELECT TOP 2 [column]
FROM [Table]
GROUP BY [column]
ORDER BY [column] DESC
) a
MySQL:
SELECT `column`
FROM `table`
GROUP BY `column`
ORDER BY `column` DESC
LIMIT 1,1
Aktualisieren:
SQL Server 2012 unterstützt jetzt eine viel sauberere (und standardmäßige ) OFFSET / FETCH-Syntax:
SELECT TOP 2 [column]
FROM [Table]
GROUP BY [column]
ORDER BY [column] DESC
OFFSET 1 ROWS
FETCH NEXT 1 ROWS ONLY;
n
. Dieser besteht diesen Test.
TOP
und OFFSET
in derselben Abfrage verwenden kann.
Ich nehme an, Sie können so etwas tun:
SELECT * FROM Table ORDER BY NumericalColumn DESC LIMIT 1 OFFSET 1
oder
SELECT * FROM Table ORDER BY NumericalColumn DESC LIMIT (1, 1)
abhängig von Ihrem Datenbankserver. Hinweis: SQL Server führt kein LIMIT aus.
OFFSET 2
Am einfachsten wäre es, den zweiten Wert aus dieser Ergebnismenge in der Anwendung zu erhalten:
SELECT DISTINCT value FROM Table ORDER BY value DESC LIMIT 2
Wenn Sie jedoch den zweiten Wert mithilfe von SQL auswählen müssen, wie wäre es mit:
SELECT MIN(value) FROM (SELECT DISTINCT value FROM Table ORDER BY value DESC LIMIT 2) AS t
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
SELECT *
FROM TableName a
WHERE
2 = (SELECT count(DISTINCT(b.ColumnName))
FROM TableName b WHERE
a.ColumnName <= b.ColumnName);
Weitere Details finden Sie unter folgendem Link
http://www.abhishekbpatel.com/2012/12/how-to-get-nth-maximum-and-minimun.html
MSSQL
SELECT *
FROM [Users]
order by UserId desc OFFSET 1 ROW
FETCH NEXT 1 ROW ONLY;
MySQL
SELECT *
FROM Users
order by UserId desc LIMIT 1 OFFSET 1
Keine Unterabfragen erforderlich ... überspringen Sie einfach eine Zeile und wählen Sie die zweite Zeile nach der Reihenfolge absteigend aus
SELECT MAX(Salary) FROM Employee WHERE Salary NOT IN (SELECT MAX(Salary) FROM Employee )
Diese Abfrage gibt das maximale Gehalt aus dem Ergebnis zurück, das kein maximales Gehalt aus der Gesamttabelle enthält.
Dies ist ein sehr einfacher Code. Sie können Folgendes ausprobieren: -
Beispiel: Tabellenname = Test
salary
1000
1500
1450
7500
MSSQL-Code, um den zweitgrößten Wert zu erhalten
select salary from test order by salary desc offset 1 rows fetch next 1 rows 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.
select * from (select ROW_NUMBER() over (Order by Col_x desc) as Row, Col_1
from table_1)as table_new tn inner join table_1 t1
on tn.col_1 = t1.col_1
where row = 2
Hoffe diese Hilfe, um den Wert für jede Zeile zu erhalten .....
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 -
select max([COLUMN_NAME]) from [TABLE_NAME] where [COLUMN_NAME] **IN**
( select max([COLUMN_NAME]) from [TABLE_NAME] )
SELECT
*
FROM
table
WHERE
column < (SELECT max(columnq) FROM table)
ORDER BY
column DESC LIMIT 1
Es ist der esiest Weg:
SELECT
Column name
FROM
Table name
ORDER BY
Column name DESC
LIMIT 1,1
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
Gehalt
::
GRUPPIERE NACH
SELECT amount FROM salary
GROUP by amount
ORDER BY amount DESC
LIMIT 1 , 1
UNTERSCHEIDLICH
SELECT DISTINCT amount
FROM salary
ORDER BY amount DESC
LIMIT 1 , 1
Erster Teil von LIMIT = Startindex
Zweiter Teil von LIMIT = wie viele Werte
select max(column_name) from table_name
where column_name not in (select max(column_name) from table_name);
nicht in ist eine Bedingung, die den höchsten Wert von column_name ausschließt.
Referenz: Programmiererinterview
Siehe Auswählen der n-ten Zeile in einer SQL-Datenbanktabelle. .
Sybase SQL Anywhere unterstützt:
SELECT TOP 1 START AT 2 value from table ORDER BY value
select top 1 MyIntColumn from MyTable
where
MyIntColumn <> (select top 1 MyIntColumn from MyTable order by MyIntColumn desc)
order by MyIntColumn desc