sql : récupérer les lignes complètes comprenant une valeur max pour un groupe identifiant donné

Problème tout aussi épineux que commun : les 3 solutions sont présentées sur http://stackoverflow.com/questions/7745609/sql-select-only-rows-with-max-value-on-a-column.

– inner join entre le groupe englobant et le sous-groupe de lignes max avec jonction sur le groupe identifiant

select yt.id, yt.rev, yt.contents
from YourTable yt
inner join(
    select id, max(rev) rev
    from YourTable
    group by id
) ss on yt.id = ss.id and yt.rev = ss.rev

– sélection sur le groupe englobant avec comme critères le groupe identifiant et la valeur max :

SELECT * 
FROM t1 WHERE (id,rev) IN 
( SELECT id, MAX(rev)
  FROM t1
  GROUP BY id
)

– une troisième solution plus « mike gyver » 😉 Faire une left join de la table sur elle même en mettant une condition de supériorité dans le groupe identifiant, et ne garder que les lignes sans contrepartie à droite (sans valeur supérieure, donc valeur max !) :

(exemple à rédiger !)

PS : mysql a un comportement différent dans sa manière de gérer les group by => plus d’infos dans cet excellent article.

Ce contenu a été publié dans sql. Vous pouvez le mettre en favoris avec ce permalien.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *