Was ist die einfachste SQL-Abfrage, um den zweitgrößten Wert zu finden?
Frage
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.
Lösung
SELECT MAX( col )
FROM table
WHERE col < ( SELECT MAX( col )
FROM table )
Andere Tipps
SELECT MAX(col) FROM table WHERE col NOT IN (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 geclustert ist.
Dies liegt daran, dass der Sortiervorgang im Vergleich zum Tabellen- oder Indexscan relativ langsam ist max
Aggregation verwendet.
Alternativ können Sie in Microsoft SQL 2005 und höher das verwenden ROW_NUMBER()
Funktion:
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 vielleicht klären, welche Datenbank Sie benötigen.Wenn ich jedoch 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 ein paar, die funktionieren, aber zwei vollständige Scans der Tabelle ermöglichen.Sie möchten sicherstellen, dass beim zweiten Scan nur zwei Werte berücksichtigt 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 Standard) OFFSET/FETCH-Syntax:
SELECT TOP 2 [column]
FROM [Table]
GROUP BY [column]
ORDER BY [column] DESC
OFFSET 1 ROWS
FETCH NEXT 1 ROWS ONLY;
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.
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
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
Eine sehr einfache Abfrage, um den zweitgrößten Wert zu finden
SELECT `Column` FROM `Table` ORDER BY `Column` DESC LIMIT 1,1;
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 nicht das maximale Gehalt aus der Gesamttabelle enthält.
Alte Frage, ich weiß, aber das gab mir einen besseren Führungsplan:
SELECT TOP 1 LEAD(MAX (column)) OVER (ORDER BY column desc)
FROM TABLE
GROUP BY column
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
Ich hoffe, das hilft dabei, den Wert für jede Zeile zu ermitteln .....
Am einfachsten von allen
select sal from salary order by sal desc limit 1 offset 1
Das ist ein sehr einfacher Code, Sie können Folgendes ausprobieren:-
ex :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 „Offset 1 Zeilen“ die 2. Zeile der Tabelle und „Nur die nächsten 1 Zeilen abrufen“ bedeutet, dass nur diese eine Zeile angezeigt wird.Wenn Sie „Nur die nächsten 1 Zeilen abrufen“ nicht verwenden, werden alle Zeilen ab der zweiten Zeile angezeigt.
select min(sal) from emp where sal in
(select TOP 2 (sal) from emp order by sal desc)
Notiz
sal ist der Col-Name
emp ist der Tabellenname
Tom, ich glaube, das wird fehlschlagen, wenn mehr als ein Wert zurückgegeben wird select max([COLUMN_NAME]) from [TABLE_NAME]
Abschnitt.d.h.wenn der Datensatz mehr als 2 Werte enthält.
Eine geringfügige Änderung Ihrer Abfrage wird funktionieren -
select max([COLUMN_NAME]) from [TABLE_NAME] where [COLUMN_NAME] **IN**
( select max([COLUMN_NAME]) from [TABLE_NAME] )
select max(COL_NAME) from TABLE_NAME where COL_NAME in
(select COL_NAME from TABLE_NAME where COL_NAME < (select max(COL_NAME) from TABLE_NAME));
Die Unterabfrage gibt alle Werte außer dem größten zurück.Wählen Sie den Maximalwert aus der zurückgegebenen Liste aus.
select col_name
from (
select dense_rank() over (order by col_name desc) as 'rank', col_name
from table_name ) withrank
where rank = 2
SELECT
*
FROM
table
WHERE
column < (SELECT max(columnq) FROM table)
ORDER BY
column DESC LIMIT 1
Es ist der einfachste Weg:
SELECT
Column name
FROM
Table name
ORDER BY
Column name DESC
LIMIT 1,1
select age from student group by id having age<(select max(age) from student)order by age limit 1
Wie Sie doppelte Werte erwähnt haben.In diesem Fall können Sie verwenden UNTERSCHEIDBAR Und GRUPPIERE NACH um den zweithöchsten Wert herauszufinden
Hier ist eine Tabelle
Gehalt
:
GRUPPIERE NACH
SELECT amount FROM salary
GROUP by amount
ORDER BY amount DESC
LIMIT 1 , 1
UNTERSCHEIDBAR
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(sal) FROM emp
WHERE sal NOT IN (SELECT top 3 sal FROM emp order by sal desc )
Dadurch wird der dritthöchste Sal der Emp-Tabelle zurückgegeben
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 zweiten Zeilen nach der Reihenfolge durch Absteigen aus
Etwas wie das?Ich habe es allerdings nicht getestet:
select top 1 x
from (
select top 2 distinct x
from y
order by x desc
) z
order by x
Sehen Wie wähle ich die n-te Zeile in einer SQL-Datenbanktabelle aus?.
Sybase SQL Anywhere unterstützt:
SELECT TOP 1 START AT 2 value from table ORDER BY value
Verwenden einer korrelierten Abfrage:
Select * from x x1 where 1 = (select count(*) from x where x1.a < a)
select * from emp e where 3>=(select count(distinct salary)
from emp where s.salary<=salary)
Diese Abfrage wählt die maximal drei Gehälter aus.Wenn zwei Mitarbeiter das gleiche Gehalt erhalten, hat dies keinen Einfluss auf die Abfrage.
select top 1 MyIntColumn from MyTable
where
MyIntColumn <> (select top 1 MyIntColumn from MyTable order by MyIntColumn desc)
order by MyIntColumn desc
Das funktioniert in MS SQL:
select max([COLUMN_NAME]) from [TABLE_NAME] where [COLUMN_NAME] <
( select max([COLUMN_NAME]) from [TABLE_NAME] )
Abfrage, um die zweithöchste Zahl in einer Zeile zu finden-
select Top 1 (salary) from XYZ
where Salary not in (select distinct TOP 1(salary) from XYZ order by Salary desc)
ORDER BY Salary DESC
Durch Ändern der Hervorhebung Top 1
Zu TOP 2
, 3
oder 4
Sie können den dritt-, vier- und fünfthöchsten Wert finden.