PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Como agrupar por mês no PostgreSQL

Problema:


Você gostaria de agrupar registros por mês em um banco de dados PostgreSQL.

Exemplo:


Nosso banco de dados tem uma tabela chamada watch com dados nas colunas id , name e production_timestamp .
id nome production_timestamp
1 assistir 2019-03-01 11:45:23
2 relógio inteligente 2019-09-15 07:35:13
3 banda inteligente 2019-09-22 17:22:05

Solução:


Você pode usar o DATE_TRUNC() função para agrupar registros em uma tabela por mês.

Aqui está a consulta que você escreveria:
SELECT 
       DATE_TRUNC('month',production_timestamp)
         AS  production_to_month,
       COUNT(id) AS count 
FROM watch
GROUP BY DATE_TRUNC('month',production_timestamp);

Segue o resultado da consulta:
produção_para_mês contagem
2019-03-01 00:00:00 1
2019-09-01 00:00:00 2

Discussão:


Use o DATE_TRUNC() função se você deseja recuperar uma data ou hora com uma precisão específica de um banco de dados PostgreSQL. (No nosso exemplo, usamos a precisão do mês.)

Esta função recebe dois argumentos. Primeiro, temos o especificador de parte de data (no nosso exemplo, 'mês'). Observe que o especificador é uma string e precisa ser colocado entre aspas.

O segundo argumento é o valor do carimbo de data/hora; pode ser uma expressão que retorna um valor de carimbo de data/hora ou o nome de uma coluna de carimbo de data/hora. (No nosso exemplo, usamos a coluna production_timestamp ).

A função DATE_TRUNC() trunca o carimbo de data/hora com a precisão fornecida (neste caso, o mês). Em nosso banco de dados, o smartwatch tem a data de produção 2019-09-15 07:35:13; depois de truncado para a precisão do mês, torna-se 2019-09-01 00:00:00 . A precisão em nível de mês faz com que o dia seja exibido como '01' e a hora seja preenchida com zeros. (As partes de data truncadas (por exemplo, dias, meses) do carimbo de data/hora são substituídas por outras.)

Agrupar registros por mês é muito comum no PostgreSQL. Em nosso exemplo, o número de produtos é totalizado para cada mês. (O COUNT() função agregada conta o número de produtos). Se você agrupar registros usando uma função de agregação, deverá usar a cláusula GROUP BY. Após a cláusula GROUP BY, você deve colocar as colunas ou expressões usadas com a função agregada na instrução SELECT. (No nosso exemplo, este é DATE_TRUNC( 'month', production_timestamp) .)

Claro, você não precisa usar o DATE_TRUNC() função apenas para agrupar registros. Você também pode usá-lo para obter o primeiro dia do mês para uma determinada data.

Para cada relógio, vamos obter o nome e a data de produção com a precisão do mês – sem necessidade de agrupamento. Aqui está a consulta que você escreveria:
SELECT name,
       DATE_TRUNC('month',production_timestamp)
         AS  production_to_month
FROM watch;

Aqui está o resultado:
nome produção_para_mês
assistir 2019-03-01 00:00:00
relógio inteligente 2019-09-01 00:00:00
banda inteligente 2019-09-01 00:00:00

Nesta consulta, a função DATE_TRUNC() trunca o carimbo de data/hora para a precisão do mês. Em nosso banco de dados, o smartwatch tem a data de produção '2019-09-15 07:35:13'; agora é '2019-09-01 00:00:00' , que é o primeiro dia do mês.