Heim >Datenbank >MySQL-Tutorial >Wie wähle ich die obersten N Zeilen innerhalb jeder Gruppe in PostgreSQL aus?

Wie wähle ich die obersten N Zeilen innerhalb jeder Gruppe in PostgreSQL aus?

Susan Sarandon
Susan SarandonOriginal
2025-01-15 10:46:46533Durchsuche

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

Gruppierung LIMIT in PostgreSQL verwenden, um Zeilen innerhalb einer Gruppe auszuwählen

In PostgreSQL können Sie Fensterfunktionen und die PARTITION BY-Klausel verwenden, um die ersten N Zeilen jeder Gruppierung abzurufen. Diese Technik ist besonders nützlich, wenn die Zeilen in jeder Gruppierung nach einer bestimmten Spalte sortiert werden müssen.

Betrachten Sie das folgende Formular:

<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>

Um die ersten beiden Zeilen jeder section_id, sortiert nach der Namensspalte, zu extrahieren, können Sie die folgende Abfrage verwenden:

<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>

Diese Abfrage verwendet die Fensterfunktion ROW_NUMBER(), um jeder Gruppierung eine eindeutige Zeilennummer beginnend bei 1 zuzuweisen. Durch die Partitionierung der Daten nach Abschnitts-ID und die Sortierung der Zeilen nach Namen innerhalb jeder Gruppierung werden den sortierten Datensätzen fortlaufende Zeilennummern zugewiesen. Schließlich filtert die äußere Abfrage Zeilen mit Zeilennummern größer als 2 heraus und wählt effektiv die ersten beiden Zeilen für jede section_id aus.

Das obige ist der detaillierte Inhalt vonWie wähle ich die obersten N Zeilen innerhalb jeder Gruppe in PostgreSQL aus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn