Problém:
Chcete seskupit data podle roku.
Příklad I:
Jeden ze sloupců ve vašich datech je transaction_date . Obsahuje datum. Chtěli byste seskupit všechna svá data podle roku a vypočítat celkové peníze vydělané každý rok.
data tabulka vypadá takto:
| transaction_date | peníze |
|---|---|
| 25.03.2018 | 1700 |
| 2019-09-12 | 100 |
| 2018-07-14 | 1200 |
| 2018-01-05 | 400 |
| 2019-06-08 | 2000 |
| 2020-03-06 | 1500 |
Řešení 1 (zobrazení roku a vydělaných peněz):
SELECT EXTRACT(year FROM transaction_date) AS year, SUM(money) AS money_earned FROM data GROUP BY EXTRACT(year FROM transaction_date);
Výsledek je:
| rok | peníze_vydělané |
|---|---|
| 2020 | 1500 |
| 2019 | 2100 |
| 2018 | 3300 |
Řešení 2 (zobrazení úplného data, roku a peněz vydělaných v odpovídajícím roce):
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;
Výsledek je:
| transaction_date | rok | peníze_vydělané |
|---|---|---|
| 25.03.2018 | 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 |
Diskuse:
V tomto příkladu se předpokládá, že nemáte year sloupec. Místo toho máte sloupec s úplnými daty.
Nejprve musíte získat rok od data. Můžete použít EXTRACT(part FROM date) funkci k tomu. Ve vašem případě byste chtěli extrahovat rok, tedy part je year . date je sloupec, který obsahuje data – transaction_date sloupec. Je dobré sloupec přejmenovat na rok poté. Pokud se chcete dozvědět více o EXTRACT funkce a jak získat různé části z data, najdete zde.
Pokud chcete zobrazit pouze rok a celkové peníze vydělané v tomto roce, můžete použít GROUP BY . První vybraný sloupec je rok extrahovaný z data. Druhý sloupec je agregační funkce SUM(money) . Na konci dotazu potřebujete GROUP BY EXTRACT(year FROM transaction_date) nebo, jednodušeji, GROUP BY 1 (since EXTRACT(year FROM transaction_date) je první sloupec.)
Pokud chcete zobrazit více sloupců, potřebujete funkci okna (řešení 2). Po SUM(money) napíšete OVER() klauzuli a protože chcete vypočítat součet za každý rok, použijte PARTITION BY EXTRACT(year FROM transaction_date) uvnitř toho. Všimněte si, že při výpočtu součtu ještě nemáte sloupec rok, takže PARTITION BY year nebude fungovat – zobrazí se chyba 'column "year" does not exist' . Více o funkcích okna si můžete přečíst v tomto článku.
Příklad II:
Jeden ze sloupců ve vašich údajích je year . Chtěli byste seskupit všechna svá data do tohoto sloupce a vypočítat celkové peníze vydělané každý rok.
data tabulka vypadá takto:
| rok | měsíc | den | peníze |
|---|---|---|---|
| 2018 | 3 | 25 | 1700 |
| 2019 | 9 | 12 | 100 |
| 2018 | 7 | 14 | 1200 |
| 2018 | 1 | 5 | 400 |
| 2019 | 6 | 8 | 2000 |
| 2020 | 3 | 6 | 1500 |
Řešení 1 (zobrazení roku a vydělaných peněz):
SELECT year, SUM(money) AS money_earned FROM data GROUP BY year;
Výsledek je:
| rok | peníze_vydělané |
|---|---|
| 2020 | 1500 |
| 2018 | 3300 |
| 2019 | 2100 |
Řešení 2 (zobrazení roku, měsíce, dne a peněz vydělaných v odpovídajícím roce):
SELECT year, month, day, SUM(money) OVER(PARTITION BY year) AS money_earned FROM data;
Výsledek je:
| rok | měsíc | den | peníze_vydělané |
|---|---|---|---|
| 2018 | 3 | 25 | 3300 |
| 2018 | 7 | 14 | 3300 |
| 2018 | 1 | 5 | 3300 |
| 2019 | 9 | 12 | 2100 |
| 2019 | 6 | 8 | 2100 |
| 2020 | 3 | 6 | 1500 |
Diskuse:
V tomto příkladu se předpokládá, že již máte year sloupec.
Chcete-li zobrazit rok a celkové peníze vydělané v tomto roce, použijte jednoduchý GROUP BY stačí. Pokud se necítíte dobře s konceptem GROUP BY , podívejte se sem, kde to vysvětlujeme. Jednoduše použijete agregační funkci (zde:SUM ) se správným sloupcem a na konci dotazu seskupte podle year . Sloupec můžete přejmenovat pomocí AS klíčové slovo s novým názvem.
Je to složitější, pokud byste chtěli zobrazit i některé další sloupce. Pak potřebujete řešení pomocí funkce okna (Řešení 2). Měli byste použít agregační funkci s příslušným sloupcem (zde:SUM(money) ) a napište OVER() doložka následně. V tomto článku byste měli použít PARTITION BY se sloupcem, podle kterého chcete seskupit. Takto získáte:
SUM(money) OVER(PARTITION BY year)
V tomto řešení nepoužíváte GROUP BY doložka.
Více o funkcích okna si můžete přečíst zde.