Sélectionnez Lignes avec la valeur de colonne maximale groupée par une autre colonne sans instruction select nestede

Je sais qu'il s'agit d'un doublon du groupe Sélectionner les lignes avec une colonne maximale, mais je souhaite sélectionner les lignes ayant la valeur de colonne maximale, en tant que groupe par une autre colonne, mais sans instruction select nestede. ce:

SELECT T.Name, T.Rank, T.ID FROM MyTable T WHERE T.Rank = ( SELECT MAX( T1.Rank) FROM MyTable T1 WHERE T1.Name= T.Name ) 

ID, Rank, Name est le schéma de la table, et je veux grouper les résultats par Name d'abord, puis choisir une rangée dans chaque groupe Name, en fonction de celle qui a le rang le plus élevé.

Ci-joint un échantillon de la table que je veux sélectionner entrez la description de l'image ici

 mysql> SELECT t1.nm, t1.rank,t1.id FROM mytable t1 LEFT JOIN ( SELECT nm, max(rank) as top FROM mytable t2 GROUP BY nm ) AS t2 ON t1.nm=t2.nm AND t1.rank = t2.top WHERE t2.nm IS not NULL ORDER BY nm; +----+------+---------+ | nm | rank | id | +----+------+---------+ | m | -1 | b7kjhsf | | n | 13 | d3sf | +----+------+---------+ 2 rows in set (0.00 sec) mysql> select * from mytable; +----+------+----------+ | nm | rank | id | +----+------+----------+ | n | 11 | asfd | | n | 11 | bsf | | n | 11 | zzasdfsf | | n | 13 | d3sf | | n | 11 | effesf | | n | 10 | yxxgesf | | n | 11 | bkhjusf | | m | -1 | b7kjhsf | | m | -4 | cdfgabsf | +----+------+----------+ 9 rows in set (0.00 sec) 

Comme mentionné dans l'autre réponse, la seule autre alternative que je connaisse est l'utilisation d'expressions de table communes:

 ;WITH CTE AS ( T.Name, T.Rank, T.ID, ROW_NUMBER() OVER (PARTITION BY Name ORDER BY Rank DESC) AS RowNumber FROM MyTable ) SELECT * FROM CTE WHERE RowNumber = 1 
 SELECT Name, Id, Rank FROM ( SELECT T.Name, T.Id, T.Rank, RANK() OVER (PARTITION BY T.Name ORDER BY T.Rank DESC) = 1 AS NameRank FROM MyTable T ) WHERE NameRank = 1 

Vous ne savez pas si vous essayez simplement d'exclure la sélection nestede et si la participation à une sous-sélection est acceptable. Si c'est le cas:-

 SELECT T.Name, T.Rank, T.ID FROM MyTable T INNER JOIN (SELECT Name, MAX(Rank) AS MaxRank FROM MyTable GROUP BY Name ) T1 ON T.Name = T1.Name AND T.Rank = T1.MaxRank