我想在查询中建立一个排名列-我在Stack上发现了一些类似的案例,但这有点不同,我不能完全使它起作用。我有一个表EnrollmentX,其中有两列,一个唯一的StudentID和一个GroupId(出于参数的考虑,组1:3)。我需要同时计算这三个组中每一个的学生数量,然后按学生数量对这些组进行排名。就计数而言,我已经做到了:

SELECT
   EnrollmentX.GroupId,
   COUNT(EnrollmentX.StudentId) AS StudentCnt
FROM EnrollmentX
GROUP BY
   EnrollmentX.GroupId


这样会得出两列,一列用于GroupId,1:3,一列用于StudentCnt,每个组中的学生人数均正确。我无法解决的是如何在构建第三个排名列之后使用该StudentCnt列。

最佳答案

如果您使用的是mysql 8,则还有更多可读选项。如果需要不同的排名,请在内部查询中更改顺序。

SELECT GroupId, StudentCnt, @Rank:=@Rank + 1 AS rank FROM
(SELECT EnrollmentX.GroupId,
       COUNT(EnrollmentX.StudentId) AS StudentCnt
    FROM EnrollmentX
    GROUP BY
       EnrollmentX.GroupId
ORDER BY StudentCnt DESC
) x CROSS JOIN (SELECT @Rank:=0) y

10-07 18:06