在 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
分解查询:
括号内的子查询计算每个学生分数的排名:
输出:
执行此查询将返回以下结果:
NAME | SCORE |
---|---|
willy | 2 |
willy | 3 |
zoe | 5 |
zoe | 6 |
此查询有效检索前两个与使用简单的 MAX() 聚合相比,可以更全面地了解每个学生的分数。
以上是如何在 SQL 中检索每个组的前两个分数?的详细内容。更多信息请关注PHP中文网其他相关文章!