首页 >数据库 >mysql教程 >如何在 PostgreSQL 中选择每个组中的前 N ​​行?

如何在 PostgreSQL 中选择每个组中的前 N ​​行?

Susan Sarandon
Susan Sarandon原创
2025-01-15 10:46:46537浏览

How to Select the Top N Rows within Each Group in PostgreSQL?

在PostgreSQL中使用分组LIMIT选择分组内的行

在PostgreSQL中,可以使用窗口函数和PARTITION BY子句来检索每个分组的前N行。当需要按特定列对每个分组中的行进行排序时,此技术特别有用。

考虑以下表格:

<code class="language-sql">CREATE TABLE xxx (
  id SERIAL PRIMARY KEY,
  section_id INT,
  name VARCHAR(255)
);
INSERT INTO xxx (id, section_id, name) VALUES
  (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>

要提取按name列排序的每个section_id的前两行,可以使用以下查询:

<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()窗口函数为每个分组分配一个唯一的行号,从1开始。通过按section_id对数据进行分区,并在每个分组内按name对行进行排序,它将连续的行号分配给排序后的记录。最后,外部查询过滤掉行号大于2的行,有效地为每个section_id选择前两行。

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

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