select to_char(date,'Mon') as mon,
extract(year from date) as yyyy,
sum("Sales") as "Sales"
from yourtable
group by 1,2
A pedido de Radu, explicarei essa consulta:
to_char(date,'Mon') as mon,
: converte o atributo "date" no formato definido da forma abreviada de mês.
extract(year from date) as yyyy
: A função "extrair" do Postgresql é usada para extrair o ano AAAA do atributo "data".
sum("Sales") as "Sales"
: A função SUM () adiciona todos os valores "Vendas" e fornece um alias com distinção entre maiúsculas e minúsculas, mantendo a diferenciação entre maiúsculas e minúsculas usando aspas duplas.
group by 1,2
: A função GROUP BY deve conter todas as colunas da lista SELECT que não fazem parte do agregado (ou seja, todas as colunas que não estão nas funções SUM / AVG / MIN / MAX etc). Isso informa à consulta que o SUM () deve ser aplicado a cada combinação exclusiva de colunas, que neste caso são as colunas de mês e ano. A parte "1,2" é uma abreviação em vez de usar os aliases da coluna, embora provavelmente seja melhor usar as expressões completas "to_char (...)" e "extract (...)" para facilitar a leitura.
date_trunc
não é exatamente o que o consulente queria:select date_trunc('month', timestamp '2001-02-16 20:38:40')::date
=>2001-02-01
date_trunc
nagroup by
cláusula.Não acredito que a resposta aceita tenha tantos votos positivos - é um método horrível.
Aqui está a maneira correta de fazer isso, com date_trunc :
É uma prática ruim, mas você pode ser perdoado se usar
em uma consulta muito simples.
Você também pode usar
se você não quiser selecionar a data.
fonte
date_trunc
não é o que o autor da pergunta esperava:select date_trunc('month', timestamp '2001-02-16 20:38:40')
=>2001-02-01 00:00:00
.to_char(date_trunc('month', txn_date), 'YY-Mon')
date_trunc
foi criado para esse fim exato. não há nenhuma razão para criar duas colunasto_char
na verdade, permite que você retire o ano e o mês de uma só vez!ou no caso do exemplo do usuário acima:
fonte
date_trunc
método ao executar o grupo por. Experimentação a uma DB eu tenho à mão, em uma tabela com 270k linhas, o método date_trunc é mais de duas vezes a velocidade do TO_CHARExiste outra maneira de obter o resultado usando a função date_part () no postgres.
obrigado
fonte
A resposta da bma é ótima! Eu o usei com o ActiveRecords, aqui está se alguém precisar no Rails:
fonte
yourscopeorclass.group("extract(year from tablename.colname)")
e você pode cadeia que junto 3 vezes para obter ano, mês, diaVeja o exemplo E deste tutorial -> https://www.postgresqltutorial.com/postgresql-group-by/
Você precisa chamar a função no seu GROUP BY em vez de chamar o nome do atributo virtual que você criou ao selecionar. Eu estava fazendo o que todas as respostas acima recomendavam e estava recebendo um
column 'year_month' does not exist
erro.O que funcionou para mim foi:
fonte
O Postgres possui alguns tipos de carimbos de data / hora:
registro de data e hora sem fuso horário - (Preferível para armazenar registros de data e hora UTC) Você encontra-o no armazenamento de banco de dados multinacional. O cliente, nesse caso, cuidará do deslocamento do fuso horário para cada país.
registro de data e hora com fuso horário - O deslocamento do fuso horário já está incluído no registro de data e hora.
Em alguns casos, seu banco de dados não usa o fuso horário, mas você ainda precisa agrupar registros em relação ao fuso horário local e ao horário de verão (por exemplo, https://www.timeanddate.com/time/zone/romania/bucharest )
Para adicionar fuso horário, você pode usar este exemplo e substituir o deslocamento do fuso horário pelo seu.
Para adicionar o deslocamento +1 no horário de verão específico para o horário de verão, você precisa verificar se o carimbo de data / hora se enquadra no horário de verão. Como esses intervalos variam de 1 a 2 dias, usarei uma aproximação que não afeta os registros do final do mês, portanto, neste caso, posso ignorar o intervalo exato de cada ano.
Se for necessário criar uma consulta mais precisa, você precisará adicionar condições para criar mais casos. Mas, grosso modo, isso funcionará bem na divisão de dados por mês em relação ao fuso horário e ao SummerTime quando você encontrar o carimbo de data e hora sem fuso horário no banco de dados:
fonte