Maison >base de données >tutoriel mysql >Comment récupérer les N premières lignes par groupe dans PostgreSQL ?

Comment récupérer les N premières lignes par groupe dans PostgreSQL ?

Barbara Streisand
Barbara Streisandoriginal
2025-01-15 10:23:46221parcourir

How to Retrieve the Top N Rows per Group in PostgreSQL?

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn