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
Freigeben: 2025-01-09 13:21:42
Original
190 Leute haben es durchsucht

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:
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;
Nach dem Login kopieren

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:
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;
Nach dem Login kopieren

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:
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;
Nach dem Login kopieren

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>
Nach dem Login kopieren

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!

Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage