Heim >Datenbank >MySQL-Tutorial >Wie rufe ich die obersten N Zeilen pro Gruppe in PostgreSQL ab?

Wie rufe ich die obersten N Zeilen pro Gruppe in PostgreSQL ab?

Barbara Streisand
Barbara StreisandOriginal
2025-01-15 10:23:46168Durchsuche

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

PostgreSQL: Abrufen der obersten N Zeilen für jede Gruppe

PostgreSQL erfordert häufig das Abrufen einer bestimmten Anzahl von Zeilen aus jeder Gruppe innerhalb eines Datensatzes. Dies ist besonders nützlich, wenn Sie mit Rangfolgedaten arbeiten oder die Ergebnisse pro Kategorie einschränken müssen. Beispielsweise möchten Sie möglicherweise die drei besten Produkte aus jeder Abteilung, sortiert nach Umsatz.

Anschauliches Beispiel:

Betrachten Sie eine Tabelle mit dem Namen products mit der folgenden Struktur und Beispieldaten:

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

Ziel ist es, aus jedem department_id die beiden besten Produkte (basierend auf den Verkäufen) abzurufen. Das erwartete Ergebnis wäre:

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

Lösung mit ROW_NUMBER() (PostgreSQL 8.4 und höher):

PostgreSQL 8.4 und höher bieten die Fensterfunktion ROW_NUMBER() und bieten so eine effiziente Lösung. Die folgende Abfrage erledigt die Aufgabe:

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

Diese Abfrage weist jedem Produkt innerhalb seiner Abteilung basierend auf den Verkäufen einen Rang (rn) zu und filtert dann, um nur diejenigen einzubeziehen, deren Rang kleiner oder gleich 2 ist.

Das obige ist der detaillierte Inhalt vonWie rufe ich die obersten N Zeilen pro Gruppe in PostgreSQL ab?. 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