PostgreSQL : Récupération des N premières lignes pour chaque groupe
PostgreSQL nécessite souvent de récupérer un nombre spécifique de lignes de chaque groupe au sein d'un ensemble de données. Ceci est particulièrement utile lorsqu’il s’agit de données classées ou lorsqu’il faut limiter les résultats par catégorie. Par exemple, vous souhaiterez peut-être les 3 meilleurs produits de chaque département, classés par ventes.
Exemple illustratif :
Considérons une table nommée products
avec la structure et les exemples de données suivants :
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 |
L'objectif est de récupérer les 2 meilleurs produits (en fonction des ventes) de chaque department_id
. Le résultat attendu serait :
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 |
Solution utilisant ROW_NUMBER() (PostgreSQL 8.4 et versions ultérieures) :
PostgreSQL 8.4 et versions ultérieures offrent la fonction ROW_NUMBER()
window, offrant une solution efficace. La requête suivante accomplit la tâche :
<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>
Cette requête attribue un classement (rn
) à chaque produit au sein de son département en fonction des ventes, puis filtre pour inclure uniquement ceux dont le classement est inférieur ou égal à 2.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!