Obtenga registros con el <whatever> más alto / más pequeño por grupo
¿Como hacer eso
El título anterior de esta pregunta era "using rank (@Rank: = @Rank + 1) en consultas complejas con subconsultas: ¿funcionará? "porque estaba buscando una solución usando rangos, pero ahora veo que la solución publicada por Bill es mucho mejor.
Pregunta original:
Estoy tratando de componer una consulta que tome el último registro de cada grupo dado un orden definido:
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
Expresión@Rank := @Rank + 1
normalmente se usa para el rango, pero para mí parece sospechoso cuando se usa en 2 subconsultas, pero se inicializa solo una vez. ¿Funcionará de esta manera?
Y segundo, ¿funcionará con una subconsulta que se evalúa varias veces? Como subconsulta en la cláusula where (o having) (otra forma de cómo escribir lo anterior):
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
¡Gracias por adelantado