J'essaie de sélectionner deux colonnes dans une table (ID et état). Le tableau doit montrer l'état avec la valeur maximale pour chaque ID. J'ai essayé quelques autres exemples mais rien ne semble fonctionner.
Structure de données d'origine:
ID state value (FLOAT)
1 TX 921,294,481
1 SC 21,417,296
1 FL 1,378,132,290
1 AL 132,556,895
1 NC 288,176
1 GA 1,270,986,631
2 FL 551,374,452
2 LA 236,645,530
2 MS 2,524,536,050
2 AL 4,128,682,333
2 FL 1,503,991,028
La structure de données résultante devrait donc ressembler à ceci:
ID STATE (Max Value)
1 FL
2 AL
La Floride et l'Alabama ont les valeurs les plus élevées dans leurs groupes d'identification.
Toute aide serait grandement appréciée à ce sujet. J'ai trouvé une SO réponse ici déjà, mais je n'ai pas pu faire fonctionner les réponses pour moi.
Pour SQL Server (et autres produits avec fonctions fenêtrées):
SELECT *
FROM
(
SELECT
*,
ROW_NUMBER() OVER (PARTITION BY ID ORDER BY value desc) as rn
FROM
UnnamedTable
) t
WHERE
t.rn = 1
Vous pouvez utiliser une sous-requête pour obtenir ce résultat:
select t1.id, t1.[state] MaxValue
from yourtable t1
inner join
(
select id, max(value) MaxVal
from yourtable
group by id
) t2
on t1.id = t2.id
and t1.value = t2.maxval
order by t1.id
Voir SQL Fiddle with Demo
Une solution, basée sur l'hypothèse que value
est numérique:
SELECT
[ID],
[State],
[Value]
FROM
(
SELECT
[ID],
[State],
[Value],
Rank() OVER (PARTITION BY [ID] ORDER BY [Value] DESC) AS [Rank]
FROM [t1]
) AS [sub]
WHERE [sub].[Rank] = 1
ORDER BY
[ID] ASC,
[State] ASC
Si plusieurs State
avec le même ID
ont le même Value
, ils obtiendraient tous le même Rank
. C'est différent de l'utilisation de Row_Number
, qui renvoie des numéros de ligne uniques, mais l'ordre est choisi arbitrairement. (Voir aussi: SQL RANK () contre ROW_NUMBER () )