首页 >数据库 >mysql教程 >如何在 SQL 中获取每组的前 N ​​行?

如何在 SQL 中获取每组的前 N ​​行?

Linda Hamilton
Linda Hamilton原创
2025-01-25 12:07:09904浏览

How to Get the Top N Rows per Group in SQL?

SQL技巧:按组获取前N行数据

本文介绍如何高效地从SQL数据库中提取每个分组的前N行数据。我们将使用窗口函数,例如ROW_NUMBER()、RANK()和DENSE_RANK(),实现这一目标。这些函数能够在指定的分区内生成唯一的标识符,非常适合进行分组和行选择。

使用ROW_NUMBER()

ROW_NUMBER()函数为每个分区内的行分配从1开始的连续序号。

<code class="language-sql">SELECT *, ROW_NUMBER() OVER (PARTITION BY id ORDER BY rate DESC) AS rn
FROM h
WHERE year BETWEEN 2000 AND 2009</code>

此示例中,ROW_NUMBER()创建了一个名为“rn”的新列,为每个id分组内的行分配序号。

使用RANK()和DENSE_RANK()

RANK()和DENSE_RANK()函数提供了另一种对分组内行进行编号的方法。RANK()为具有相同排序的行分配非重复值,而DENSE_RANK()分配连续值。

<code class="language-sql">SELECT *, RANK() OVER (PARTITION BY id ORDER BY rate DESC) AS rk,
DENSE_RANK() OVER (PARTITION BY id ORDER BY rate DESC) AS dr
FROM h
WHERE year BETWEEN 2000 AND 2009</code>

RANK()和DENSE_RANK()分别创建了“rk”和“dr”列,表示每个行在其id分组内的排名和密集排名。

结合LIMIT或TOP限制结果

为每个分组分配唯一标识符后,可以使用LIMIT或TOP修饰符来仅检索每个分组的指定行数。

<code class="language-sql">SELECT *
FROM h
WHERE year BETWEEN 2000 AND 2009
ORDER BY id, rate DESC
LIMIT 5</code>

此示例中,LIMIT修饰符检索每个id分组的前5行。您可以根据需要调整数字。

以上是如何在 SQL 中获取每组的前 N ​​行?的详细内容。更多信息请关注PHP中文网其他相关文章!

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