web-dev-qa-db-fra.com

Sélectionnez la valeur de la colonne où l'autre colonne est au maximum du groupe

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.

30
Richard Todd

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
37

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

7
Taryn

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 () )

7
Jacco