Erhalte den zweithöchsten Wert in einer Tabelle

14
id value
1   50
2   60
3   55

select max(value) from tablename;

Im Allgemeinen wissen wir, dass wir 60 bekommen werden, aber ich brauche den nächsten Wert 55.

Wie erhalte ich den Wert 55 mit SQL?

Mahfuz Morshed
quelle

Antworten:

24

Unter der Annahme, dass der höchste Wert nur einmal vorkommt, ist eine andere Möglichkeit die Verwendung OFFSET(SQL Server 2012 oder höher):

SELECT * 
FROM tablename
ORDER BY column DESC 
OFFSET 1 ROW 
FETCH NEXT 1 ROW ONLY;
Renato Afonso
quelle
24

Um den zweithöchsten eindeutigen Wert in der Tabelle zu erhalten, können Sie verwenden

SELECT MIN(value)
FROM   (SELECT DISTINCT TOP (2) value
        FROM   tablename
        ORDER  BY value DESC)T
/*If only one distinct value return nothing. */
HAVING MIN(value) <> MAX(value);
Martin Smith
quelle
13

Eine generische Lösung kann wie folgt aussehen:

;WITH CTE AS
(
    SELECT
        Col1
        , Col2
        , <AnyColumns>
        , ROW_NUMBER() OVER (ORDER BY <AnyColumns>) AS RowNum
    FROM <YourTable>
    WHERE <YourCondition>
)
SELECT *
FROM CTE
WHERE RowNum = 2 -- Or any condition which satisfies your problem

Hier können Sie auch den Bereich wie definieren RowNum >= 10 AND RowNum <= 20. Und es gibt Ihnen 10. bis 20. Zeilen mit allen erforderlichen Spalten.

SwapnilBhate
quelle
7

Sie haben den üblichen Top-Trick wie:

select top 1 *
from (
    select top 2 *
    from my_table
    order by value desc
    ) t 
order by value asc 

Oder Sie können CTE auch wie folgt verwenden:

with CTE as
(
select value, ROW_NUMBER() over(order by value desc) as ord_id
from my_table
)
select value
from CTE
where ord_id = 2

Oder, wenn Sie die neueste Version von SQLServer (> = 2012) verwenden, die Verzögerungsfunktion .

SELECT  top 1  lag(value, 1,0) OVER (ORDER BY value)  
FROM my_table
order by value desc
Irimias
quelle
5

Ich werde das so machen:

SELECT MAX(value)
FROM tablename
WHERE value < (SELECT MAX(value)
               FROM tablename)
Amo
quelle
1

Sie können auch die ROW_NUMBER()Fensterfunktion verwenden. Wenn Sie den 2. Eintrag erhalten möchten, wenn Sie nach Ihrem Zielwert geordnet sind, können Sie Folgendes tun:

SELECT value 
FROM (
    SELECT 
        ROW_NUMBER() OVER (PARTITION BY NULL ORDER BY value DESC) as RN,
        value
    FROM my_table
) d
WHERE RN = 2

Wenn Sie nun den zweithöchsten Wert erhalten möchten und Duplikate haben, möchten Sie möglicherweise nach dem Werteintrag gruppieren, sodass Sie nur eindeutige Werte erhalten.

SELECT value 
FROM (
    SELECT 
        ROW_NUMBER() OVER (PARTITION BY NULL ORDER BY value DESC) as RN,
        value
    FROM my_table
    GROUP BY value
) d
WHERE RN = 2

Sie sollten in der Lage sein, diesen Ansatz zu ändern, um a MIN(id)in die innere Auswahl aufzunehmen, wenn Sie die ID des ersten Datensatzes mit dem zweithöchsten Wert kennen müssen (vorausgesetzt, Sie hatten einen Datensatz mit zwei 60ern und zwei 55ern).

CodeMonkey
quelle
5
Für den zweithöchsten ist es einfacher, nur zu ersetzen ROW_NUMBER()mit DENSE_RANK()- Sie auch alle anderen Spalten kostenlos. Keine Notwendigkeit zu benutzen GROUP BY.
ypercubeᵀᴹ