Jest problem z roztworem Quassnoi użytkownika (oznaczone jako najlepszej odpowiedzi).
Mam ten sam problematyczny (tj symulowanie funkcji SQL okno w MySQL) i użyłem do wdrożenia rozwiązanie Quassnoi, wykorzystując zmienne zdefiniowane przez użytkownika do przechowywania poprzednią wartość wiersza ...
Ale może po aktualizacji MySQL lub cokolwiek, moje zapytanie już nie działało. Wynika to z faktu, że kolejność oceny pól w SELECT nie jest gwarantowana. Przypisanie klasy @ może zostać ocenione przed @student assignment, nawet jeśli zostanie umieszczone po SELECT.
to wymieniono w dokumentacji MySQL następująco:
Jako ogólną zasadę należy nigdy przypisać wartość do zmiennej użytkownika i odczytać wartość w tym samym komunikacie. Możesz uzyskać oczekiwane wyniki , ale nie jest to gwarantowane.Kolejność oceny dla wyrażeń obejmujących zmienne użytkownika jest niezdefiniowana i może zmieniać się w zależności od elementów zawartych w danej instrukcji; ponadto, nie można zagwarantować, że ta kolejność między wersjami serwera MySQL będzie niedostępna dla wersji .
źródło: http://dev.mysql.com/doc/refman/5.5/en/user-variables.html
Wreszcie Użyłem trick takiego mieć pewność, aby przypisać @class po przeczytaniu go:
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
Korzystanie lewo() jest właśnie używany do ustawiania @ zmienna klasy. Następnie połącz wynik lewy() (równy NULL), aby oczekiwany wynik był przezroczysty.
Niezbyt elegancki, ale działa!
Zastanawiam się, czy MySQL obsługuje funkcję okna RANK(): http://en.wikipedia.org/wiki/Select_(SQL)#Limiting_result_rows –