PostgreSQL:检索每组的前 N 行
PostgreSQL 通常需要从数据集中的每个组中检索特定数量的行。当处理排名数据或需要限制每个类别的结果时,这特别有用。 例如,您可能想要每个部门的前 3 个产品,按销售额排序。
示例:
考虑一个名为 products
的表,其结构和示例数据如下:
product_id | department_id | product_name | sales |
---|---|---|---|
1 | 1 | Product A | 100 |
2 | 1 | Product B | 150 |
3 | 1 | Product C | 200 |
4 | 1 | Product D | 250 |
5 | 2 | Product E | 50 |
6 | 2 | Product F | 100 |
7 | 3 | Product G | 120 |
8 | 2 | Product H | 180 |
目标是从每个 department_id
中检索排名前 2 的产品(基于销售额)。 预期结果将是:
product_id | department_id | product_name | sales |
---|---|---|---|
4 | 1 | Product D | 250 |
3 | 1 | Product C | 200 |
8 | 2 | Product H | 180 |
6 | 2 | Product F | 100 |
7 | 3 | Product G | 120 |
使用 ROW_NUMBER() 的解决方案(PostgreSQL 8.4 及更高版本):
PostgreSQL 8.4及以上版本提供了ROW_NUMBER()
窗口函数,提供了高效的解决方案。 以下查询完成任务:
<code class="language-sql">SELECT product_id, department_id, product_name, sales FROM ( SELECT ROW_NUMBER() OVER (PARTITION BY department_id ORDER BY sales DESC) AS rn, product_id, department_id, product_name, sales FROM products ) ranked_products WHERE rn <= 2;</code>
此查询根据销售额为其部门内的每个产品分配排名 (rn
),然后进行筛选以仅包含排名小于或等于 2 的产品。
以上是如何在 PostgreSQL 中检索每组的前 N 行?的详细内容。更多信息请关注PHP中文网其他相关文章!