PostgreSQL中的分组限制:按自定义列排序选择每个组中的前N行
为了根据自定义列顺序检索每个组中的前N行,PostgreSQL为用户(特别是使用PostgreSQL 8.4及以上版本的用户)提供了一种解决方案。
考虑包含列'id'、'section_id'和'name'的示例表:
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 |
根据提供的数据,所需输出是为每个'section_id'选择前两行(按'name'排序)。
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>
这段高级解决方案利用带有'PARTITION BY'和'ORDER BY'子句的'ROW_NUMBER()'函数来实现所需的结果集。'xxx'表中的每一行都在其各自的'section_id'组内分配一个排名,行按'name'排序。通过基于条件'x.r <= 2'的后续选择,我们有效地限制了每个组中返回的行数。
以上是如何在 PostgreSQL 中选择按特定列排序的每组前 N 行?的详细内容。更多信息请关注PHP中文网其他相关文章!