En versiones superiores a mysql 8.0, hay una función ROW_NUMBER() OVER (PARTITION BY) que se puede usar para agrupar y ordenar dentro de grupos, pero las versiones inferiores a 5.7 no tienen esta función. Podemos usar variables temporales para lograr este efecto.
1 grupo por
Ejemplo de demanda: ahora necesitamos contar las clasificaciones de desempeño de los estudiantes en varias materias. Necesitamos instalar materias para agruparlas y luego ordenarlas en orden inverso a las puntuaciones.
Hay una tabla de estudiantes de la siguiente manera:
CREATE TABLE `student` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键Id',
`name` varchar(5) NOT NULL COMMENT '学生姓名',
`subject` varchar(6) DEFAULT NULL COMMENT '科目',
`score` smallint(3) DEFAULT NULL COMMENT '分数',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8;
Los datos de la tabla son los siguientes:
id nombre sujeto puntuación
1 Zhang San Chino 77
2 Li Si Chino 67
3 Wang Wu Chino 85
4 Zhang San Matemáticas 82
5 Li Si Matemáticas 67
6 Wang Wu Inglés 85
7 Wang Wu Matemáticas 85
SELECT a.NAME, a.score, a.SUBJECT, @last :=IF(@FIRST = a.SUBJECT, @last + 1, 1 ) AS rn, @FIRST := a.SUBJEC