Obter registros com maior / menor <tudo> por grupo
Como fazer isso
título @Former desta pergunta era "using rank (@Rank: = @Rank + 1) em consultas complexas com subconsultas - funcionará? "porque eu estava procurando uma solução usando classificações, mas agora vejo que a solução postada por Bill é muito melhor.
Pergunta original:
Estou tentando compor uma consulta que levaria o último registro de cada grupo, dada uma ordem definida:
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
Expression@Rank := @Rank + 1
normalmente é usado para classificação, mas para mim parece suspeito quando usado em duas subconsultas, mas inicializado apenas uma vez. Funcionará assim?
E segundo, ele funcionará com uma subconsulta avaliada várias vezes? Como a subconsulta na cláusula where (ou having) (outra maneira de escrever o acima):
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
Desde já, obrigado