Maison >base de données >tutoriel mysql >Comment sélectionner les N premières lignes de chaque groupe dans PostgreSQL ?

Comment sélectionner les N premières lignes de chaque groupe dans PostgreSQL ?

Susan Sarandon
Susan Sarandonoriginal
2025-01-15 10:46:46582parcourir

How to Select the Top N Rows within Each Group in PostgreSQL?

Utilisation du regroupement LIMIT dans PostgreSQL pour sélectionner des lignes au sein d'un groupe

Dans PostgreSQL, vous pouvez utiliser les fonctions de fenêtre et la clause PARTITION BY pour récupérer les N premières lignes de chaque regroupement. Cette technique est particulièrement utile lorsque les lignes de chaque groupe doivent être triées selon une colonne spécifique.

Considérez la forme suivante :

<code class="language-sql">CREATE TABLE xxx (
  id SERIAL PRIMARY KEY,
  section_id INT,
  name VARCHAR(255)
);
INSERT INTO xxx (id, section_id, name) VALUES
  (1, 1, 'A'),
  (2, 1, 'B'),
  (3, 1, 'C'),
  (4, 1, 'D'),
  (5, 2, 'E'),
  (6, 2, 'F'),
  (7, 3, 'G'),
  (8, 2, 'H');</code>

Pour extraire les deux premières lignes de chaque section_id triées par colonne de nom, vous pouvez utiliser la requête suivante :

<code class="language-sql">SELECT
  * 
FROM (
  SELECT
    ROW_NUMBER() OVER (PARTITION BY section_id ORDER BY name) AS r,
    t.*
  FROM
    xxx t) x
WHERE
  x.r <= 2;</code>

Cette requête utilise la fonction de fenêtre ROW_NUMBER() pour attribuer un numéro de ligne unique à chaque groupe, en commençant par 1. En partitionnant les données par section_id et en triant les lignes par nom au sein de chaque groupe, il attribue des numéros de ligne consécutifs aux enregistrements triés. Enfin, la requête externe filtre les lignes dont le numéro est supérieur à 2, sélectionnant ainsi les deux premières lignes pour chaque section_id.

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