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?
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:
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;
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);
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.
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
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)
ROW_NUMBER()
parDENSE_RANK()
- vous obtenez également toutes les autres colonnes gratuitement. Pas besoin d'utiliserGROUP BY
.