【问题标题】:Creating a ranking column from a queried column in MySQL从 MySQL 中的查询列创建排名列
【发布时间】:2018-06-22 07:40:40
【问题描述】:

我想在我的查询中建立一个排名列——我在 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 点了。

标签: mysql mysql-8.0


【解决方案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

【讨论】:

  • 太棒了,这很有效,而且很有意义——我的部分问题原来是第 3 行上的“AS”的一些问题,它一直为我破坏 SELECT,所以我想我可能已经比我意识到的更近了。出于某种原因,我的版本(我在 8 上)拒绝使用 AS 保存具有不同名称的变量。
  • 谁能告诉我这个解决方案在 MS SQL 中会有什么变化?我是 SQL 新手,并试图尽可能地理解这两个版本,并且在 MS SQL 中声明变量似乎非常不同。
  • @ThoureaulyRekt 忘记变量,查看RANK() over (partition by EnrollmentX.GroupId order by something desc) 的 MS sql。
【解决方案2】:

试试这个查询:

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

【讨论】:

    【解决方案3】:

    试试吧..

    SET @Rank = 0;
    SELECT @Rank:=@Rank + 1 rank, EnrollmentX.GroupId,
           COUNT(EnrollmentX.StudentId) StudentCnt
        FROM EnrollmentX
        GROUP BY
           EnrollmentX.GroupId
    ORDER BY StudentCnt DESC;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-27
      • 2011-08-01
      • 1970-01-01
      • 2011-06-27
      • 2015-08-12
      • 1970-01-01
      • 2014-01-06
      相关资源
      最近更新 更多