首页 >数据库 >mysql教程 >如何限制 PostgreSQL 中每个组内的行数?

如何限制 PostgreSQL 中每个组内的行数?

DDD
DDD原创
2025-01-15 12:09:45554浏览

How to Limit Rows Within Each Group in PostgreSQL?

PostgreSQL 分组限制:显示每个分组中的前 N 行

数据库中经常需要从特定分组中提取有限数量的行。在 PostgreSQL 中,可以使用 LIMIT 子句结合分组操作来满足此需求。

以下示例演示了需要在每个 section_id 分组中检索前两行(按 name 列排序)的需求。例如,从给定的表中:

<code> id | section_id | name
----+------------+------
  1 |          1 | A
  2 |          1 | B
  3 |          1 | C
  4 |          1 | D
  5 |          2 | E
  6 |          2 | F
  7 |          3 | G
  8 |          2 | H</code>

我们希望获得以下结果:

<code> id | section_id | name
----+------------+------
  1 |          1 | A
  2 |          1 | B
  5 |          2 | E
  6 |          2 | F
  7 |          3 | G</code>

在 8.4 之前的 PostgreSQL 版本中,缺乏内置函数来有效处理此类查询。然而,在 PostgreSQL 8.4 及更高版本中,出现了一种新的解决方案:

<code class="language-sql">SELECT *
FROM (
  SELECT ROW_NUMBER() OVER (PARTITION BY section_id ORDER BY name) AS r, t.*
  FROM xxx t
) x
WHERE x.r <= 2;</code>

此解决方案利用 ROW_NUMBER() 窗口函数为每个 section_id 分区内的每一行分配一个顺序号。ORDER BY 子句指定排序条件(在本例中为 name)。然后将 LIMIT 2 条件应用于子查询,将结果限制为每个分组的前两行(按 name 排序)。

以上是如何限制 PostgreSQL 中每个组内的行数?的详细内容。更多信息请关注PHP中文网其他相关文章!

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