MySQL 5.7 之前不支持分组的 row_number() 函数,但可以通过子查询和变量实现。具体步骤如下:
在 SELECT 子句中,使用变量定义一个计数器,初始值为 0。
使用子查询获取每个分组内的排序结果,并将排序结果赋值给变量。
根据当前分组内的计数器值(即行号)和已经计算出的排序结果进行比较,如果相等,则输出当前行。
以下是一个示例:
SET @group_id = '';
SET @row_num = 0;
SELECT id, name, age, department, salary
FROM (
SELECT id, name, age, department, salary,
@row_num := IF(@group_id = department, @row_num + 1, 1) AS row_num,
@group_id := department AS group_id
FROM employees
ORDER BY department ASC, salary DESC
) t
WHERE t.row_num <= 3;
在这个示例中,我们想要获取每个部门内工资排名前三的员工信息。首先,我们需要定义两个变量 @group_id 和 @row_num,用于记录当前分组的部门和计数器值。
然后,我们使用一个子查询对所有员工按照部门升序和工资降序排序。在排序过程中,我们使用 IF 函数来判断当前员工是否属于同一部门,如果是,则将计数器加 1;如果不是,则将计数器重置为 1 并更新当前分组的部门值。
最后,我们在外层查询中筛选出行号小于等于 3 的员工信息,即每个部门内工资排名前三的员工。