数据库中经常需要从特定分组中提取有限数量的行。在 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中文网其他相关文章!