Comment obtenir des enregistrements avec le plus grand / plus petit par groupe?
L'ancien titre de cette question était "utilisation de rank (@Rank := @Rank + 1) dans une requête complexe avec des sous-requêtes - est-ce que ça marchera?" parce que je cherchais une solution utilisant des rangs, mais maintenant je vois que la solution proposée par Bill est bien meilleure.
Question originale :
Je cherche à composer une requête qui prendrait le dernier enregistrement de chaque groupe en fonction d'un ordre défini :
SET @Rank=0;
select s.*
from (select GroupId, max(Rank) AS MaxRank
from (select GroupId, @Rank := @Rank + 1 AS Rank
from Table
order by OrderField
) as t
group by GroupId) as t
join (
select *, @Rank := @Rank + 1 AS Rank
from Table
order by OrderField
) as s
on t.GroupId = s.GroupId and t.MaxRank = s.Rank
order by OrderField
L'expression @Rank := @Rank + 1
est normalement utilisée pour le rang, mais pour moi cela semble suspect quand elle est utilisée dans 2 sous-requêtes, mais initialisée une seule fois. Est-ce que cela fonctionnera de cette manière?
Et deuxièmement, est-ce que cela fonctionnera avec une seule sous-requête qui est évaluée plusieurs fois? Comme une sous-requête dans la clause where (ou having) (une autre façon d'écrire ce qui précède) :
SET @Rank=0;
select Table.*, @Rank := @Rank + 1 AS Rank
from Table
having Rank = (select max(Rank) AS MaxRank
from (select GroupId, @Rank := @Rank + 1 AS Rank
from Table as t0
order by OrderField
) as t
where t.GroupId = table.GroupId
)
order by OrderField
Merci d'avance!