Ottieni il secondo valore più alto in una tabella


14
id value
1   50
2   60
3   55

select max(value) from tablename;

Generalmente sappiamo che ne otterremo 60, ma ho bisogno del prossimo valore 55.

Come ottengo il valore 55 usando SQL?

Risposte:


24

Supponendo che il valore più alto si verifichi solo una volta, un altro modo sarebbe utilizzare OFFSET(SQL Server 2012 o successivo):

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

23

Per ottenere il secondo valore distinto più alto nella tabella è possibile utilizzare

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

Una soluzione generica può essere come di seguito:

;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

Qui puoi anche definire l'intervallo come RowNum >= 10 AND RowNum <= 20. E ti darà dalla 10a alla 20a fila con tutte le colonne richieste.


7

Hai il solito trucco principale come:

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

Oppure puoi anche usare CTE come:

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

In alternativa, se si utilizza la versione recente di SQL Server (> = 2012), la funzione di ritardo .

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

5

Farò così:

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

1

Puoi anche usare la ROW_NUMBER()funzione di finestre. Se si desidera ottenere la seconda voce quando viene ordinato in base al valore target, è possibile effettuare:

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

Ora se vuoi ottenere il 2 ° valore più alto e hai duplicati, potresti voler raggruppare in base alla voce del valore in modo da ottenere solo valori distinti.

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

Dovresti essere in grado di modificare questo approccio per includere a MIN(id)nella selezione interna se devi conoscere l'ID del primo record con il 2 ° valore più alto (supponendo che tu avessi un set di dati con due 60 e due 55)


5
Per il secondo più alto è più semplice sostituirlo ROW_NUMBER()con DENSE_RANK(): ottieni anche tutte le altre colonne gratuitamente. Non c'è bisogno di usare GROUP BY.
ypercubeᵀᴹ
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.