首页 >数据库 >mysql教程 >如何在 SQL 中检索每个组的前两个分数?

如何在 SQL 中检索每个组的前两个分数?

Barbara Streisand
Barbara Streisand原创
2025-01-03 05:21:37838浏览

How to Retrieve the Top Two Scores for Each Group in SQL?

在 SQL 中检索各个组的前两个分数

在关系数据库中,从大型数据集中提取有意义的数据通常涉及基于记录进行分组关于具体特征。从分组集中检索数据时,通常使用聚合函数获取每个组内的最高或最低值。但是,如果您需要为每个组选择前 N 行怎么办?

考虑下表,其中包含学生姓名及其相应的分数:

NAME SCORE
willy 1
willy 2
willy 3
zoe 4
zoe 5
zoe 6

分组的聚合函数仅允许您将获得每个名字的最高分。要检索每个学生的前两名分数,需要采用不同的方法。

以下查询使用子查询来跟踪每个学生在各自组中的分数排名来实现此目的:

SELECT *
FROM test s
WHERE 
        (
            SELECT COUNT(*) 
            FROM test f
            WHERE f.name = s.name AND 
                  f.score >= s.score
        ) <= 2

分解查询:

  • 外部查询,SELECT * FROM test s,从测试表中检索所有行并将它们别名为 s。
  • 括号内的子查询计算每个学生分数的排名:

    • SELECT COUNT(*) FROM test f:这部分计算测试表中名称(f.name)与当前行名称匹配的行数(s.name) 并且分数 (f.score) 大于或等于当前行的分数 (s.score)。
  • WHERE 子句应用过滤器外部查询,仅选择那些排名(由子查询确定)小于或等于的行2.

输出:

执行此查询将返回以下结果:

NAME SCORE
willy 2
willy 3
zoe 5
zoe 6

此查询有效检索前两个与使用简单的 MAX() 聚合相比,可以更全面地了解每个学生的分数。

以上是如何在 SQL 中检索每个组的前两个分数?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn