MySQL高效获取每个分组的前N行数据
问题描述:
在数据库查询中,您可能需要为每个数据分组仅检索前N行数据。例如,您的数据集可能包含按年份和ID分组的多行信息。如果您想显示每个ID的前五条评分最高的记录,则需要实现一种方法来将结果限制为所需数量。
解决方案:
在MySQL 8或更高版本中,您可以使用ROW_NUMBER、RANK或DENSE_RANK函数来实现此目的。您选择的具体函数取决于“前N行”的确切定义以及如何处理并列情况。以下是这些函数生成的结果的细分:
示例:
以下查询使用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中文网其他相关文章!