0

我想在我的查询中建立一个排名列——我在 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 列之后使用它来创建第三个排名列。

4

3 回答 3

1

如果您使用的是 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
于 2018-06-22T07:48:56.987 回答
1

试试这个查询:

select ex.GroupId, ex.StudentId, exg.cnt from EnrollmentX ex
left join (
    SELECT GroupId, COUNT(*) cnt 
    FROM EnrollmentX
    GROUP BY GroupId
) exg on ex.GroupId = exg.GroupId
order by exg.cnt
于 2018-06-22T08:09:51.483 回答
1

尝试一下..

SET @Rank = 0;
SELECT @Rank:=@Rank + 1 rank, EnrollmentX.GroupId,
       COUNT(EnrollmentX.StudentId) StudentCnt
    FROM EnrollmentX
    GROUP BY
       EnrollmentX.GroupId
ORDER BY StudentCnt DESC;
于 2018-06-22T09:07:14.910 回答