Hay un problema con la solución de Quassnoi (marcado como mejor respuesta).
que tienen la misma problemática (es decir, la simulación de la función ventana SQL en MySQL) y yo solía poner en práctica la solución de Quassnoi, el uso de variables definidas por el usuario para almacenar valor de la fila anterior ...
Pero, tal vez después de una actualización de MySQL o lo que sea, mi consulta ya no funcionaba. Esto se debe a que el orden de evaluación de los campos en SELECT no está garantizado. La asignación de clase @ podría evaluarse antes de la asignación de @student, incluso si se coloca después en SELECT.
Esto se ve mencionado en la documentación de MySQL de la siguiente manera:
Como regla general, nunca se debe asignar un valor a una variable de usuario y leer el valor dentro de la misma declaración. Es posible que obtenga los resultados que espera, pero esto no está garantizado.El orden de evaluación para expresiones que involucran variables de usuario no está definido y puede cambiar en función de los elementos contenidos en una declaración dada; Además, esta orden no garantiza que sea la misma entre las versiones del servidor MySQL.
fuente: http://dev.mysql.com/doc/refman/5.5/en/user-variables.html
fin he utilizado un truco así que para asegurarse de asignar @class después de leerlo:
SELECT id_student, id_class, grade,
@student:=CASE WHEN @class <> id_class THEN concat(left(@class:=id_class, 0), 0) ELSE @student+1 END AS rn
FROM
(SELECT @student:= -1) s,
(SELECT @class:= -1) c,
(SELECT *
FROM mytable
ORDER BY id_class, grade desc
) t
Utilizando la función de la izquierda() sólo se utiliza para establecer @ variable de clase Luego, concatene el resultado de left() (igual a NULL) al resultado esperado es transparente.
No muy elegante pero funciona!
Me pregunto si MySQL admite la función de ventana RANK(): http://en.wikipedia.org/wiki/Select_(SQL)#Limiting_result_rows –