【问题标题】:Query the second highest value of a name, if there's only one value return null查询名字的第二大值,如果只有一个值返回null
【发布时间】:2021-06-10 18:18:32
【问题描述】:

我有一张表,有 2 列,分别命名为“姓名”和“分数”,展示了一个班级的学业成绩。

“姓名”:安迪、艾米、克洛伊、约翰等

“分数”:从 0 到 100

有些学生已经提交了所有的测试,但有些学生由于疫情尚未完成,换句话说,有些学生只得到了一个结果。 现在我需要弄清楚他们每个人的第二高分是多少。

如果学生只提交了一次,意味着他们没有第二高的分数,所以我们将返回 null 作为分数。

我试过了

SELECT 
name,
    CASE
        WHEN COUNT(score) IS NULL THEN NULL
        ELSE MAX(score)
    END AS second_highest
FROM
    result
WHERE
    score NOT IN (SELECT 
            MAX(score)
        FROM
            result
        GROUP BY name)
GROUP BY name
ORDER BY name;

但似乎子查询排除了一次提交学生的唯一分数,因此他们不会显示在查询结果中。 这种方法有什么我需要改变的还是有更好的方法?

Input and output can be found here 抱歉,我不熟悉在 Stackoverflow 上演示示例 我使用 MySQL 版本 8.0.22

【问题讨论】:

  • 提供样本数据作为 CREATE TABLE + INSERT INTO 和所需的输出。指定精确 MySQL 版本。

标签: mysql sql


【解决方案1】:

使用ROW_NUMBER()窗口函数对每个学生的分数进行排名,然后通过条件聚合得到第二高的分数:

SELECT name,
       MAX(CASE WHEN rn = 2 THEN score END) second_highest
FROM (
  SELECT *, ROW_NUMBER() OVER (PARTITION BY name ORDER BY score DESC) rn
  FROM result
) t
GROUP BY name

请参阅demo

【讨论】:

    猜你喜欢
    • 2018-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-10
    • 1970-01-01
    • 2017-06-24
    • 1970-01-01
    相关资源
    最近更新 更多