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
Libérer: 2025-01-15 10:23:46
original
217 Les gens l'ont consulté

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal