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中文網其他相關文章!