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?

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;

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);

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.


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

5

Ich werde das so machen:

SELECT MAX(value)
FROM tablename
WHERE value < (SELECT MAX(value)
               FROM tablename)

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).


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ᵀᴹ
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.