Problem:
Sie möchten Ihre Daten nach Jahr gruppieren.
Beispiel I:
Eine der Spalten in Ihren Daten ist transaction_date
. Es enthält ein Datum. Sie möchten alle Ihre Daten nach Jahr gruppieren und die Gesamteinnahmen pro Jahr berechnen.
Die data
Tabelle sieht so aus:
transaction_date | Geld |
---|---|
2018-03-25 | 1700 |
2019-09-12 | 100 |
2018-07-14 | 1200 |
2018-01-05 | 400 |
2019-06-08 | 2000 |
2020-03-06 | 1500 |
Lösung 1 (Anzeige des Jahres und des verdienten Geldes):
SELECT EXTRACT(year FROM transaction_date) AS year, SUM(money) AS money_earned FROM data GROUP BY EXTRACT(year FROM transaction_date);
Das Ergebnis ist:
Jahr | Geld_verdient |
---|---|
2020 | 1500 |
2019 | 2100 |
2018 | 3300 |
Lösung 2 (Anzeige des vollständigen Datums, des Jahres und des im entsprechenden Jahr verdienten Geldes):
SELECT transaction_date AS transaction_date, EXTRACT(year FROM transaction_date) AS year, SUM(money) OVER(PARTITION BY EXTRACT(year FROM transaction_date)) AS money_earned FROM data;
Das Ergebnis ist:
transaction_date | Jahr | Geld_verdient |
---|---|---|
2018-03-25 | 2018 | 3300 |
2018-07-14 | 2018 | 3300 |
2018-01-05 | 2018 | 3300 |
2019-09-12 | 2019 | 2100 |
2019-06-08 | 2019 | 2100 |
2020-03-06 | 2020 | 1500 |
Diskussion:
In diesem Beispiel wird davon ausgegangen, dass Sie das year
nicht haben Säule. Stattdessen haben Sie die Spalte mit vollständigen Daten.
Zuerst müssen Sie ein Jahr aus dem Datum abrufen. Sie können den EXTRACT(part FROM date)
verwenden Funktion dazu. In Ihrem Fall möchten Sie das Jahr extrahieren, also den part
ist year
. Das date
ist die Spalte, die die Daten enthält – das transaction_date
Säule. Es ist eine gute Idee, die Spalte danach in Jahr umzubenennen. Wenn Sie mehr über den EXTRACT
erfahren möchten Funktion und wie Sie verschiedene Teile des Datums abrufen können, finden Sie hier.
Wenn Sie nur das Jahr und den in diesem Jahr verdienten Gesamtbetrag anzeigen möchten, können Sie GROUP BY
verwenden . Die erste ausgewählte Spalte ist das aus dem Datum extrahierte Jahr. Die zweite Spalte ist die Aggregatfunktion SUM(money)
. Am Ende der Abfrage benötigen Sie ein GROUP BY EXTRACT(year FROM transaction_date)
oder, einfacher, GROUP BY 1 (since EXTRACT(year FROM transaction_date)
ist die erste Spalte.)
Wenn Sie mehr Spalten anzeigen möchten, benötigen Sie eine Fensterfunktion (Lösung 2). Nach SUM(money)
du schreibst den OVER()
-Klausel und, da Sie die Summe für jedes Jahr berechnen möchten, verwenden Sie PARTITION BY EXTRACT(year FROM transaction_date)
im Inneren. Beachten Sie, dass Sie bei der Berechnung der Summe noch keine Jahresspalte haben, also PARTITION BY year
wird nicht funktionieren – Sie würden einen Fehler erhalten 'column "year" does not exist'
. Mehr über die Fensterfunktionen erfahren Sie in diesem Artikel.
Beispiel II:
Eine der Spalten in Ihren Daten ist year
. Sie möchten alle Ihre Daten nach dieser Spalte gruppieren und die Gesamteinnahmen pro Jahr berechnen.
Die data
Tabelle sieht so aus:
Jahr | Monat | Tag | Geld |
---|---|---|---|
2018 | 3 | 25 | 1700 |
2019 | 9 | 12 | 100 |
2018 | 7 | 14 | 1200 |
2018 | 1 | 5 | 400 |
2019 | 6 | 8 | 2000 |
2020 | 3 | 6 | 1500 |
Lösung 1 (Anzeige des Jahres und des verdienten Geldes):
SELECT year, SUM(money) AS money_earned FROM data GROUP BY year;
Das Ergebnis ist:
Jahr | Geld_verdient |
---|---|
2020 | 1500 |
2018 | 3300 |
2019 | 2100 |
Lösung 2 (Anzeige von Jahr, Monat, Tag und dem im entsprechenden Jahr verdienten Geld):
SELECT year, month, day, SUM(money) OVER(PARTITION BY year) AS money_earned FROM data;
Das Ergebnis ist:
Jahr | Monat | Tag | Geld_verdient |
---|---|---|---|
2018 | 3 | 25 | 3300 |
2018 | 7 | 14 | 3300 |
2018 | 1 | 5 | 3300 |
2019 | 9 | 12 | 2100 |
2019 | 6 | 8 | 2100 |
2020 | 3 | 6 | 1500 |
Diskussion:
In diesem Beispiel wird davon ausgegangen, dass Sie das year
bereits haben Spalte.
Wenn Sie das Jahr und das in diesem Jahr verdiente Gesamtgeld anzeigen möchten, genügt ein einfacher GROUP BY
reicht. Wenn Sie sich mit dem Konzept von GROUP BY
nicht wohl fühlen , schau mal hier wo wir es erklären. Sie verwenden einfach die Aggregatfunktion (hier:SUM
) mit der richtigen Spalte und gruppieren Sie am Ende der Abfrage nach year
. Sie können die Spalte mit dem AS
umbenennen Stichwort mit neuem Namen.
Komplizierter wird es, wenn Sie noch einige andere Spalten anzeigen möchten. Dann benötigen Sie die Lösung mit einer Fensterfunktion (Lösung 2). Sie sollten die Aggregatfunktion mit der entsprechenden Spalte (hier:SUM(money)
) verwenden ) und schreiben Sie den OVER()
Klausel danach. In dieser Klausel sollten Sie PARTITION BY
verwenden mit der Spalte, nach der Sie gruppieren möchten. So erhalten Sie:
SUM(money) OVER(PARTITION BY year)
In dieser Lösung verwenden Sie kein GROUP BY
Klausel.
Hier können Sie mehr über die Fensterfunktionen lesen.