919 votes

Comment puis-je sélectionner des lignes avec MAX (valeur de colonne), DISTINCT par une autre colonne dans SQL?

Ma table est la suivante:

id  home  datetime     player   resource
---|-----|------------|--------|---------
1  | 10  | 04/03/2009 | john   | 399 
2  | 11  | 04/03/2009 | juliet | 244
5  | 12  | 04/03/2009 | borat  | 555
3  | 10  | 03/03/2009 | john   | 300
4  | 11  | 03/03/2009 | juliet | 200
6  | 12  | 03/03/2009 | borat  | 500
7  | 13  | 24/12/2008 | borat  | 600
8  | 13  | 01/01/2009 | borat  | 700

J'ai besoin de sélectionner chaque distinctes home tenue de la valeur maximale de datetime.

Le résultat serait:

id  home  datetime     player   resource 
---|-----|------------|--------|---------
1  | 10  | 04/03/2009 | john   | 399
2  | 11  | 04/03/2009 | juliet | 244
5  | 12  | 04/03/2009 | borat  | 555
8  | 13  | 01/01/2009 | borat  | 700

J'ai essayé:

-- 1 ..by the MySQL manual: 

SELECT DISTINCT home, id, datetime as dt, player, resource
    FROM topten t1
    WHERE datetime = (SELECT MAX(t2.datetime) FROM topten t2
        GROUP BY home )
GROUP BY datetime
ORDER BY datetime DESC

Ne fonctionne pas. Résultat dispose de 130 lignes bien que la base de données contient 187. Résultat comprend quelques doublons d' home.

-- 2 ..join

SELECT s1.id, s1.home, s1.datetime, s1.player, s1.resource
FROM topten s1 JOIN
(SELECT id, MAX(datetime) AS dt
  FROM topten
  GROUP BY id) AS s2
  ON s1.id = s2.id
  ORDER BY datetime 

Nope. Donne tous les enregistrements.

-- 3 ..something exotic: 

Avec des résultats différents.

1108voto

Michael La Voie Points 12445

Vous êtes si proche ! Tout que vous devez faire est de sélectionner les deux la maison et c’est max date heure, puis de rejoindre à la table des topten sur deux domaines :

81voto

Max Gontar Points 20410

Voilà la version T-SQL :

EDIT
Malheureusement, il n’y a aucune fonction RANK() sur MySQL.
Mais il peut être émulé, voir fonctions émulant analytiques (AKA classement) avec MySQL.
Donc il s’agit de la version de MySQL :

30voto

Quassnoi Points 191041

Cela fonctionne même si vous avez deux ou plusieurs lignes pour chaque d’égale ' s:

21voto

Je pense que cela vous donnera le résultat souhaité :

Si vous avez besoin d’autres colonnes aussi bien, juste faire une jointure avec la table d’origine.

Sinceres salutations.

8voto

FerranB Points 9532

Cela fonctionne sur Oracle :

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X