Heim >Datenbank >MySQL-Tutorial >Wie gruppiere ich aufeinanderfolgende numerische Werte in PostgreSQL mithilfe von GROUP BY?

Wie gruppiere ich aufeinanderfolgende numerische Werte in PostgreSQL mithilfe von GROUP BY?

Patricia Arquette
Patricia ArquetteOriginal
2025-01-09 13:21:42112Durchsuche

How to Group Consecutive Numeric Values in PostgreSQL using GROUP BY?

Verwenden von PostgreSQLs GROUP BY zum Aggregieren aufeinanderfolgender Zahlen

PostgreSQL bietet leistungsstarke Funktionen zur Datenaggregation. Dieser Leitfaden zeigt, wie man aufeinanderfolgende numerische Werte mithilfe der GROUP BY-Klausel gruppiert, wobei der Schwerpunkt insbesondere auf Szenarien mit aufeinanderfolgenden Jahren liegt.

Beispielszenario: Gruppierung von Jahren nach Unternehmen und Beruf

Stellen Sie sich eine Tabelle mit dem Namen qualification mit den Spalten company, profession und year vor. Ziel ist es, einzigartige Unternehmens-Berufs-Kombinationen zu identifizieren und ihre aufeinanderfolgenden Jahre in Arrays zu gruppieren.

Schritt-für-Schritt-Lösung:

  1. Identifizieren nicht aufeinanderfolgender Jahre: Der erste Schritt besteht darin, festzustellen, wo aufeinanderfolgende Jahressequenzen unterbrochen werden. Dies geschieht über Fensterfunktionen:
<code class="language-sql">SELECT
    company,
    profession,
    year,
    CASE
        WHEN ROW_NUMBER() OVER (PARTITION BY company, profession ORDER BY year) = 1 OR
             year - LAG(year, 1, year) OVER (PARTITION BY company, profession ORDER BY year) > 1
        THEN 1
        ELSE 0
    END AS group_cnt
FROM qualification;</code>

Diese Abfrage verwendet ROW_NUMBER(), um innerhalb jeder Unternehmens-Berufsgruppe einen eindeutigen Rang zuzuweisen, und LAG(), um das aktuelle Jahr mit dem Vorjahr zu vergleichen. group_cnt kennzeichnet nicht aufeinanderfolgende Jahre mit einem 1.

  1. Gruppen-IDs zuweisen: Als nächstes weisen wir jeder aufeinanderfolgenden Jahresfolge eine eindeutige Gruppen-ID zu:
<code class="language-sql">SELECT
    company,
    profession,
    year,
    SUM(group_cnt) OVER (ORDER BY company, profession, year) AS group_nr
FROM (
    -- The query from Step 1 goes here
) t1;</code>

Die Fensterfunktion SUM() OVER() summiert die group_cnt-Werte kumulativ und erstellt so eine laufende Summe, die als Gruppen-ID (group_nr) dient.

  1. Endgültige Aggregation: Abschließend verwenden wir array_agg(), um die Jahre innerhalb jeder Gruppe zu aggregieren:
<code class="language-sql">SELECT
    company,
    profession,
    ARRAY_AGG(year) AS years
FROM (
    -- The query from Step 2 goes here
) t2
GROUP BY company, profession, group_nr
ORDER BY company, profession, group_nr;</code>

Diese Abfrage gruppiert die Ergebnisse nach company, profession und group_nr, wobei ARRAY_AGG() verwendet wird, um die Jahre in Arrays für jede Gruppe zu kombinieren.

Erwartete Ausgabe: Die endgültige Ausgabe gruppiert aufeinanderfolgende Jahre in Arrays:

<code> company | profession |      years
---------+------------+------------------
 Google  | Programmer | {2000}
 Google  | Sales      | {2000,2001,2002}
 Google  | Sales      | {2004}
 Mozilla | Sales      | {2002}
(4 rows)</code>

Diese Methode verwaltet effizient die Gruppierung aufeinanderfolgender numerischer Werte und bietet eine klare und präzise Lösung für die Datenanalyse in PostgreSQL.

Das obige ist der detaillierte Inhalt vonWie gruppiere ich aufeinanderfolgende numerische Werte in PostgreSQL mithilfe von GROUP BY?. 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