【SQL 编程你也行】SQL实现分组排序编号(rownumber+over的替代办法)
时间: 2024-01-27 19:03:51 浏览: 28
SQL实现分组排序编号可以使用子查询和变量的方式,具体操作如下:
假设我们有一个表格叫做"student",其中包含学生的姓名、班级和成绩三个字段。现在我们想要对每个班级的学生成绩进行排序,并为每个学生生成一个编号。
首先,我们可以使用子查询将每个班级的学生进行排序,并记录下他们的分数和行号:
```
SELECT
name, class, score,
(@rn := CASE WHEN @grp = class THEN @rn + 1 ELSE 1 END) AS rn,
(@grp := class) AS grp
FROM
student
ORDER BY
class, score DESC;
```
在这个查询中,我们使用了两个变量:@rn 和 @grp。其中,@rn 代表行号,@grp 代表当前分组的班级。当当前班级与上一行不同时,@rn 重新从1开始计数;否则,@rn 加1。最后,将行号作为一个新的列添加到查询结果中。
接着,我们可以将上面的查询结果作为一个子查询,并在外层查询中根据行号进行筛选:
```
SELECT
name, class, score, rn
FROM
(SELECT
name, class, score,
(@rn := CASE WHEN @grp = class THEN @rn + 1 ELSE 1 END) AS rn,
(@grp := class) AS grp
FROM
student
ORDER BY
class, score DESC) AS t
ORDER BY
class, rn;
```
这样,我们就可以得到每个班级内部按照分数排序的学生列表,并为每个学生生成了一个行号。最后,将结果按照班级和行号排序,即可得到最终的查询结果。
需要注意的是,这种方法虽然没有使用ROW_NUMBER()和OVER()函数,但是依然使用了MySQL中的变量,因此在应用到其他数据库时需要注意语法的兼容性。