C'è un problema con la soluzione di Quassnoi (contrassegnato come migliore risposta).
Ho la stessa problematica (cioè la simulazione di funzioni SQL Finestra in MySQL) e ho usato per implementare la soluzione di Quassnoi, utilizzando variabili definite dall'utente per memorizzare precedente valore di riga ...
Ma, forse, dopo un upgrade di MySQL o qualsiasi altra cosa, la mia query non ha funzionato più. Questo perché l'ordine di valutazione dei campi in SELECT non è garantito. L'assegnazione @class potrebbe essere valutata prima dell'assegnazione @student, anche se è stata inserita dopo nella SELECT.
Questo è menzionate nelle documentazione di MySQL come segue:
Come regola generale, si dovrebbe mai assegnare un valore a una variabile utente e leggere il valore all'interno della stessa istruzione. Potresti ottenere i risultati che ti aspetti, ma questo non è garantito.L'ordine della valutazione per le espressioni che coinvolgono variabili utente non è definito e può cambiare in base agli elementi contenuti in una determinata istruzione; inoltre, questo ordine non è garantito lo stesso tra le versioni di MySQL Server.
fonte: http://dev.mysql.com/doc/refman/5.5/en/user-variables.html
Infine ho usato un trucco del genere per essere sicuri di assegnare @class dopo averlo letto:
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
Utilizzando sinistra function() è solo utilizzato per impostare @ variabile di classe. Quindi, concatena il risultato di left() (uguale a NULL) al risultato previsto è trasparente.
Non molto elegante ma funziona!
Mi chiedo se MySQL supporta la funzione della finestra RANK(): http://en.wikipedia.org/wiki/Select_(SQL)#Limiting_result_rows –