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.