Was ist die einfachste SQL-Abfrage, um den zweitgrößten Wert zu finden?

StackOverflow https://stackoverflow.com/questions/32100

  •  09-06-2019
  •  | 
  •  

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.

War es hilfreich?

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

:

enter image description here

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top