Problema:
Você deseja agrupar seus dados por ano.
Exemplo I:
Uma das colunas em seus dados é
transaction_date
. Ele contém uma data. Você gostaria de agrupar todos os seus dados por ano e calcular o total de dinheiro ganho a cada ano. Os
date
tabela fica assim:transaction_date | dinheiro |
---|---|
25-03-2018 | 1700 |
2019-09-12 | 100 |
14-07-2018 | 1200 |
2018-01-05 | 400 |
2019-06-08 | 2000 |
2020-03-06 | 1500 |
Solução 1 (exibindo o ano e o dinheiro ganho):
SELECT EXTRACT(year FROM transaction_date) AS year, SUM(money) AS money_earned FROM data GROUP BY EXTRACT(year FROM transaction_date);
O resultado é:
ano | dinheiro_ganho |
---|---|
2020 | 1500 |
2019 | 2100 |
2018 | 3300 |
Solução 2 (exibindo a data completa, o ano e o dinheiro ganho no ano correspondente):
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;
O resultado é:
transaction_date | ano | dinheiro_ganho |
---|---|---|
25-03-2018 | 2018 | 3300 |
14-07-2018 | 2018 | 3300 |
2018-01-05 | 2018 | 3300 |
2019-09-12 | 2019 | 2100 |
2019-06-08 | 2019 | 2100 |
2020-03-06 | 2020 | 1500 |
Discussão:
Neste exemplo, supõe-se que você não tenha o
year
coluna. Em vez disso, você tem a coluna com datas completas. Primeiro, você precisa recuperar um ano a partir da data. Você pode usar o
EXTRACT(part FROM date)
função para fazê-lo. No seu caso, você gostaria de extrair o ano, então a part
é year
. A date
é a coluna que contém as datas – o transaction_date
coluna. É uma boa ideia renomear a coluna para ano depois. Se você quiser saber mais sobre o EXTRACT
função e como recuperar diferentes partes da data, você pode encontrá-lo aqui. Se quiser exibir apenas o ano e o total de dinheiro ganho neste ano, você pode usar um
GROUP BY
. A primeira coluna selecionada é o ano extraído da data. A segunda coluna é a função agregada SUM(money)
. No final da consulta, você precisa de um GROUP BY EXTRACT(year FROM transaction_date)
ou, mais simples, GROUP BY 1 (since EXTRACT(year FROM transaction_date)
é a primeira coluna.) Se você quiser exibir mais colunas, precisará de uma função de janela (Solução 2). Após
SUM(money)
você escreve o OVER()
cláusula e, como você deseja calcular a soma para cada ano, use PARTITION BY EXTRACT(year FROM transaction_date)
dentro dele. Observe que você ainda não tem a coluna do ano ao calcular a soma, então PARTITION BY year
não funcionará - você receberá um erro 'column "year" does not exist'
. Você pode ler mais sobre as funções da janela neste artigo. Exemplo II:
Uma das colunas em seus dados é
year
. Você gostaria de agrupar todos os seus dados por esta coluna e calcular o total de dinheiro ganho a cada ano. Os
date
tabela fica assim:ano | mês | dia | dinheiro |
---|---|---|---|
2018 | 3 | 25 | 1700 |
2019 | 9 | 12 | 100 |
2018 | 7 | 14 | 1200 |
2018 | 1 | 5 | 400 |
2019 | 6 | 8 | 2000 |
2020 | 3 | 6 | 1500 |
Solução 1 (exibindo o ano e o dinheiro ganho):
SELECT year, SUM(money) AS money_earned FROM data GROUP BY year;
O resultado é:
ano | dinheiro_ganho |
---|---|
2020 | 1500 |
2018 | 3300 |
2019 | 2100 |
Solução 2 (exibindo ano, mês, dia e o dinheiro ganho no ano correspondente):
SELECT year, month, day, SUM(money) OVER(PARTITION BY year) AS money_earned FROM data;
O resultado é:
ano | mês | dia | dinheiro_ganho |
---|---|---|---|
2018 | 3 | 25 | 3300 |
2018 | 7 | 14 | 3300 |
2018 | 1 | 5 | 3300 |
2019 | 9 | 12 | 2100 |
2019 | 6 | 8 | 2100 |
2020 | 3 | 6 | 1500 |
Discussão:
Neste exemplo, supõe-se que você já tenha o
year
coluna. Se você quiser exibir o ano e o total de dinheiro ganho neste ano, um simples
GROUP BY
basta. Se você não se sentir confortável com o conceito de GROUP BY
, dê uma olhada aqui onde explicamos. Você simplesmente usa a função agregada (aqui:SUM
) com a coluna correta e no final da consulta você agrupa por year
. Você pode renomear a coluna usando o AS
palavra-chave com um novo nome. É mais complicado se você também quiser exibir algumas outras colunas. Então você precisa da solução usando uma função de janela (Solução 2). Você deve usar a função de agregação com a coluna apropriada (aqui:
SUM(money)
) e escreva o OVER()
cláusula depois. Nesta cláusula, você deve usar PARTITION BY
com a coluna pela qual você deseja agrupar. É assim que você obtém:SUM(money) OVER(PARTITION BY year)
Nesta solução, você não usa um
GROUP BY
cláusula. Você pode ler mais sobre as funções da janela aqui.