it-swarm.com.de

Erhalten Sie den zweithöchsten Wert in einer Tabelle

id value
1   50
2   60
3   55

select max(value) from tablename;

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

Wie erhalte ich den Wert 55 mit SQL?

14
Mahfuz Morshed

Angenommen, der höchste Wert tritt nur einmal auf, besteht eine andere Möglichkeit darin, OFFSET (SQL Server 2012 oder höher) zu verwenden:

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

Um den zweithöchsten eindeutigen Wert in der Tabelle zu erhalten, können Sie ihn 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);
24
Martin Smith

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 RowNum >= 10 AND RowNum <= 20. Und es gibt Ihnen 10. bis 20. Zeilen mit allen erforderlichen Spalten.

13
SwapnilBhate

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

Wenn Sie die neueste Version von SQLServer (> = 2012) verwenden, wird die Funktion lag verwendet.

SELECT  top 1  lag(value, 1,0) OVER (ORDER BY value)  
FROM my_table
order by value desc
7
irimias

Ich werde das tun:

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

Sie können auch die Fensterfunktion ROW_NUMBER() verwenden. Wenn Sie den 2. Eintrag erhalten möchten, wenn Sie nach Ihrem Zielwert sortiert 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 unterschiedliche 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 so zu ändern, dass ein MIN(id) in die innere Auswahl aufgenommen wird, 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 55s)

1
CodeMonkey