Obtenez la deuxième valeur la plus élevée dans un tableau


14
id value
1   50
2   60
3   55

select max(value) from tablename;

En général, nous savons que nous aurons 60, mais j'ai besoin de la prochaine valeur 55.

Comment obtenir la valeur 55 en utilisant SQL?

Réponses:


24

En supposant que la valeur la plus élevée ne se produit qu'une seule fois, une autre façon serait d'utiliser OFFSET(SQL Server 2012 ou version ultérieure):

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

23

Pour obtenir la deuxième valeur distincte la plus élevée du tableau, vous pouvez utiliser

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

Une solution générique peut être comme ci-dessous:

;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

Ici, vous pouvez également définir la plage comme RowNum >= 10 AND RowNum <= 20. Et cela vous donnera des 10e à 20e lignes avec toutes les colonnes requises.


7

Vous avez l'astuce habituelle comme:

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

Ou vous pouvez également utiliser CTE comme:

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

Ou, si vous utilisez une version récente de SQLServer (> = 2012), la fonction lag .

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

5

Je vais faire comme ça:

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

1

Vous pouvez également utiliser la ROW_NUMBER()fonction de fenêtrage. Si vous souhaitez obtenir la 2ème entrée lors de la commande par votre valeur cible, vous pouvez faire:

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

Maintenant, si vous souhaitez obtenir la 2e valeur la plus élevée et que vous avez des doublons, vous pouvez souhaiter les regrouper par entrée de valeur afin de n'obtenir que des valeurs distinctes.

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

Vous devriez pouvoir modifier cette approche pour inclure un MIN(id)dans la sélection interne si vous avez besoin de connaître l'ID du premier enregistrement avec la 2e valeur la plus élevée (en supposant que vous disposiez d'un ensemble de données avec deux 60 et deux 55)


5
Pour le deuxième plus haut, il est plus facile de simplement le remplacer ROW_NUMBER()par DENSE_RANK()- vous obtenez également toutes les autres colonnes gratuitement. Pas besoin d'utiliser GROUP BY.
ypercubeᵀᴹ
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.