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.