首页 > 数据库 > mysql教程 > 如何仅检索MySQL中每组的顶部N行?

如何仅检索MySQL中每组的顶部N行?

Susan Sarandon
发布: 2025-01-25 11:57:10
原创
867 人浏览过

How to Retrieve Only the Top N Rows per Group in MySQL?

MySQL高效获取每个分组的前N行数据

问题描述:

在数据库查询中,您可能需要为每个数据分组仅检索前N行数据。例如,您的数据集可能包含按年份和ID分组的多行信息。如果您想显示每个ID的前五条评分最高的记录,则需要实现一种方法来将结果限制为所需数量。

解决方案:

在MySQL 8或更高版本中,您可以使用ROW_NUMBER、RANK或DENSE_RANK函数来实现此目的。您选择的具体函数取决于“前N行”的确切定义以及如何处理并列情况。以下是这些函数生成的结果的细分:

  • ROW_NUMBER: 为每个组内的行分配顺序号,从1开始。如果您希望通过为具有相同值的行赋予相同的排名来打破并列,则此函数非常理想。
  • RANK: 为每个组内的行分配排名,并列情况将导致相同的排名。如果您优先考虑不同的排名,则此函数很有用。
  • DENSE_RANK: 与RANK类似,但它分配密集排名,这意味着即使存在并列,排名之间也没有间隙。当您希望确保后续行具有唯一排名时,此函数适用。

示例:

以下查询使用ROW_NUMBER函数返回每个ID的前5行,按评分降序排序:

<code class="language-sql">SELECT
    year, id, rate
FROM (
    SELECT
        year, id, rate,
        ROW_NUMBER() OVER (PARTITION BY id ORDER BY rate DESC) AS rank_num
    FROM h
    WHERE year BETWEEN 2000 AND 2009
) AS subquery
WHERE rank_num <= 5;</code>
登录后复制

输出:

year id rate
2006 p01 8.0
2003 p01 7.4
2008 p01 6.8
2001 p01 5.9
2007 p01 5.3
2001 p02 12.5
2004 p02 12.4
2002 p02 12.2
2003 p02 10.3
2000 p02 8.7

通过使用这些函数,您可以有效地将结果限制为每个分组的前N行,并确保数据的所需排序。

以上是如何仅检索MySQL中每组的顶部N行?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板