在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中文网其他相关文章!