Как выполнить групповое ранжирование в MySQL

Возникла проблема с решением sql-query Quassnoi (помечено как лучший sql-statement ответ).

У меня та же проблема sql-syntax (например, имитация оконной window-functions функции SQL в MySQL), которую mysql я использовал для реализации sql-syntax решения Quassnoi, используя sql-syntax определяемые пользователем sqlselect переменные для хранения значения sql-syntax предыдущей строки ...

Но, возможно, после sql-statement обновления MySQL или чего-то mysqld еще, мой запрос больше не mysqlclient работал. Это связано с тем, что mysqlclient порядок оценки полей в SELECT window-functions не гарантируется. Назначение mysqldump @class может быть оценено mysql-query до назначения @student, даже mysql-server если оно помещено после в analytic-functions SELECT.

Это упоминается в sql-syntax документации MySQL следующим mysql образом:

Как правило, вы никогда analytic-functions не должны присваивать значение sql-syntax пользовательской переменной. и mysql прочтите значение в том же sql-select заявлении. Вы можете получить ожидаемые mysql-server результаты, но это не гарантируется. Получатель analytic-functions чего-то оценка для выражений, включающих mysql-query пользовательские переменные, не sql-statement определена и может изменяться mysqld в зависимости от элементов, содержащихся sql-select в данном заявлении; кроме mysql того, не гарантируется, что mysqld этот порядок будет одинаковым mysql между выпуски сервера MySQL.

источник: http://dev.mysql.com/doc/refman/5.5/en/user-variables.html

Наконец, я sql-syntax использовал подобный трюк, чтобы sqlselect обязательно назначить @class sql-syntax ПОСЛЕ его прочтения:

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

Использование mysql функции left() используется mysql-server только для установки переменной mysql-server @class. Затем объедините sql-statement результат left() (равный mysql-query NULL) с ожидаемым результатом mysqld прозрачно.

Не очень элегантно, но mysqldump работает!

mysql

sql

window-functions

2022-10-26T14:52:05+00:00