Problema:
Vuoi raggruppare i tuoi dati per anno.
Esempio I:
Una delle colonne nei tuoi dati è transaction_date
. Contiene una data. Vorresti raggruppare tutti i tuoi dati per anno e calcolare il denaro totale guadagnato ogni anno.
I date
la tabella si presenta così:
data_transazione | soldi |
---|---|
25-03-2018 | 1700 |
12-09-2019 | 100 |
14-07-2018 | 1200 |
05-01-2018 | 400 |
08-06-2019 | 2000 |
06-03-2020 | 1500 |
Soluzione 1 (visualizzazione dell'anno e del denaro guadagnato):
SELECT EXTRACT(year FROM transaction_date) AS year, SUM(money) AS money_earned FROM data GROUP BY EXTRACT(year FROM transaction_date);
Il risultato è:
anno | soldi_guadagnati |
---|---|
2020 | 1500 |
2019 | 2100 |
2018 | 3300 |
Soluzione 2 (visualizzando la data completa, l'anno e il denaro guadagnato nell'anno corrispondente):
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;
Il risultato è:
data_transazione | soldi_guadagnati | |
---|---|---|
25-03-2018 | 2018 | 3300 |
14-07-2018 | 2018 | 3300 |
05-01-2018 | 2018 | 3300 |
12-09-2019 | 2019 | 2100 |
08-06-2019 | 2019 | 2100 |
06-03-2020 | 2020 | 1500 |
Discussione:
In questo esempio si presume che tu non abbia l'year
colonna. Invece hai la colonna con le date complete.
Innanzitutto, è necessario recuperare un anno dalla data. Puoi usare EXTRACT(part FROM date)
funzione per farlo. Nel tuo caso, vorresti estrarre l'anno, quindi la part
è year
. La date
è la colonna che contiene le date:il transaction_date
colonna. È una buona idea rinominare la colonna anno dopo. Se vuoi saperne di più su EXTRACT
funzione e come recuperare parti diverse dalla data, lo trovi qui.
Se desideri visualizzare solo l'anno e il totale dei soldi guadagnati in quest'anno, puoi utilizzare un GROUP BY
. La prima colonna selezionata è l'anno estratto dalla data. La seconda colonna è la funzione aggregata SUM(money)
. Alla fine della query è necessario un GROUP BY EXTRACT(year FROM transaction_date)
o, più semplice, GROUP BY 1 (since EXTRACT(year FROM transaction_date)
è la prima colonna.)
Se desideri visualizzare più colonne, hai bisogno di una funzione finestra (Soluzione 2). Dopo SUM(money)
scrivi OVER()
clausola e, poiché desideri calcolare la somma per ogni anno, utilizza PARTITION BY EXTRACT(year FROM transaction_date)
dentro. Nota che non hai ancora la colonna dell'anno per il calcolo della somma, quindi PARTITION BY year
non funzionerà – riceveresti un errore 'column "year" does not exist'
. Puoi leggere di più sulle funzioni della finestra in questo articolo.
Esempio II:
Una delle colonne nei tuoi dati è year
. Vorresti raggruppare tutti i tuoi dati in base a questa colonna e calcolare il denaro totale guadagnato ogni anno.
I date
la tabella si presenta così:
anno | giorno | soldi | |
---|---|---|---|
2018 | 3 | 25 | 1700 |
2019 | 9 | 12 | 100 |
2018 | 7 | 14 | 1200 |
2018 | 1 | 5 | 400 |
2019 | 6 | 8 | 2000 |
2020 | 3 | 6 | 1500 |
Soluzione 1 (visualizzazione dell'anno e del denaro guadagnato):
SELECT year, SUM(money) AS money_earned FROM data GROUP BY year;
Il risultato è:
anno | soldi_guadagnati |
---|---|
2020 | 1500 |
2018 | 3300 |
2019 | 2100 |
Soluzione 2 (visualizzazione di anno, mese, giorno e denaro guadagnato nell'anno corrispondente):
SELECT year, month, day, SUM(money) OVER(PARTITION BY year) AS money_earned FROM data;
Il risultato è:
anno | giorno | soldi_guadagnati | |
---|---|---|---|
2018 | 3 | 25 | 3300 |
2018 | 7 | 14 | 3300 |
2018 | 1 | 5 | 3300 |
2019 | 9 | 12 | 2100 |
2019 | 6 | 8 | 2100 |
2020 | 3 | 6 | 1500 |
Discussione:
In questo esempio si presume che tu abbia già l'year
colonna.
Se desideri visualizzare l'anno e il denaro totale guadagnato in quest'anno, un semplice GROUP BY
è abbastanza. Se non ti senti a tuo agio con il concetto di GROUP BY
, dai un'occhiata qui dove lo spieghiamo. Usa semplicemente la funzione di aggregazione (qui:SUM
) con la colonna corretta e alla fine della query raggruppi per year
. Puoi rinominare la colonna usando AS
parola chiave con un nuovo nome.
È più complicato se desideri visualizzare anche altre colonne. Quindi è necessaria la soluzione utilizzando una funzione finestra (Soluzione 2). Dovresti usare la funzione di aggregazione con la colonna appropriata (qui:SUM(money)
) e scrivi OVER()
clausola successiva. In questa clausola, dovresti usare PARTITION BY
con la colonna in base alla quale desideri raggruppare. Ecco come ottieni:
SUM(money) OVER(PARTITION BY year)
In questa soluzione, non utilizzi un GROUP BY
clausola.
Puoi leggere di più sulle funzioni della finestra qui.