Il y a un problème avec la solution de Quassnoi (marquée comme meilleure réponse).
J'ai la même problématique (c.-à simuler la fonction de fenêtre SQL dans MySQL) et moi pour mettre en œuvre la solution de Quassnoi, en utilisant des variables définies par l'utilisateur pour stocker la valeur précédente de la ligne ...
Mais, peut-être après une mise à jour MySQL ou peu importe, ma requête ne fonctionnait plus. C'est parce que l'ordre d'évaluation des champs dans SELECT n'est pas garanti. L'affectation @class peut être évaluée avant l'assignation @student, même si elle est placée après dans le SELECT.
C'est Mentionné dans la documentation MySQL comme suit:
En règle générale, vous ne devez jamais attribuer une valeur à une variable utilisateur et lisez la valeur dans la même déclaration. Vous pourriez obtenir les résultats que vous attendez, mais ce n'est pas garanti.L'ordre de évaluation pour les expressions impliquant des variables utilisateur est indéfini et peut changer en fonction des éléments contenus dans une déclaration donnée; en outre, cette commande n'est pas garantie d'être la même entre les versions du serveur MySQL.
source: http://dev.mysql.com/doc/refman/5.5/en/user-variables.html
Enfin j'ai utilisé un truc comme ça pour être sûr d'assigner @class après l'avoir lu:
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
En utilisant la fonction gauche() est juste utilisé pour définir @ variable de classe. Ensuite, concaténez le résultat de left() (égal à NULL) pour que le résultat attendu soit transparent.
Pas très élégant mais ça marche!
Je me demande si MySQL supporte la fonction de la fenêtre RANK(): http://en.wikipedia.org/wiki/Select_(SQL)#Limiting_result_rows –