sql >> Base de Datos >  >> RDS >> PostgreSQL

Cómo agrupar por mes en PostgreSQL

Problema:

Le gustaría agrupar registros por mes en una base de datos de PostgreSQL.

Ejemplo:

Nuestra base de datos tiene una tabla llamada watch con datos en las columnas id , name y production_timestamp .

id nombre marca de tiempo_producción
1 ver 2019-03-01 11:45:23
2 reloj inteligente 2019-09-15 07:35:13
3 banda inteligente 2019-09-22 17:22:05

Solución:

Puede usar el DATE_TRUNC() función para agrupar registros en una tabla por mes.

Esta es la consulta que escribirías:

SELECT 
       DATE_TRUNC('month',production_timestamp)
         AS  production_to_month,
       COUNT(id) AS count 
FROM watch
GROUP BY DATE_TRUNC('month',production_timestamp);

Este es el resultado de la consulta:

producción_al_mes contar
2019-03-01 00:00:00 1
2019-09-01 00:00:00 2

Discusión:

Usa el DATE_TRUNC() si desea recuperar una fecha u hora con una precisión específica de una base de datos PostgreSQL. (En nuestro ejemplo, usamos precisión de mes).

Esta función toma dos argumentos. Primero, tenemos el especificador de la parte de la fecha (en nuestro ejemplo, 'mes'). Tenga en cuenta que el especificador es una cadena y debe estar entre comillas.

El segundo argumento es el valor de la marca de tiempo; puede ser una expresión que devuelva un valor de marca de tiempo o el nombre de una columna de marca de tiempo. (En nuestro ejemplo, usamos la columna production_timestamp ).

La función DATE_TRUNC() trunca la marca de tiempo con la precisión dada (en este caso, el mes). En nuestra base de datos, el reloj inteligente tiene la fecha de producción 2019-09-15 07:35:13; después de que se haya truncado a la precisión del mes, se convierte en 2019-09-01 00:00:00 . La precisión de nivel de mes hace que el día se muestre como '01' y la hora se llene con ceros. (Las partes de la fecha truncada (por ejemplo, días, meses) de la marca de tiempo se reemplazan por unos.)

Agrupar registros por mes es muy común en PostgreSQL. En nuestro ejemplo, el número de productos se totaliza para cada mes. (El COUNT() función agregada cuenta el número de productos). Si agrupa registros usando una función agregada, debe usar la cláusula GROUP BY. Después de la cláusula GROUP BY, debe colocar las columnas o expresiones utilizadas con la función de agregado en la instrucción SELECT. (En nuestro ejemplo, esto es DATE_TRUNC( 'month', production_timestamp) .)

Por supuesto, no tienes que usar el DATE_TRUNC() función solo para agrupar registros. También puede usarlo para obtener el primer día del mes para una fecha determinada.

Para cada reloj, obtengamos el nombre y la fecha de producción con precisión de mes, sin necesidad de agrupar. Esta es la consulta que escribirías:

SELECT name,
       DATE_TRUNC('month',production_timestamp)
         AS  production_to_month
FROM watch;

Aquí está el resultado:

nombre producción_al_mes
reloj 2019-03-01 00:00:00
reloj inteligente 2019-09-01 00:00:00
banda inteligente 2019-09-01 00:00:00

En esta consulta, la función DATE_TRUNC() trunca la marca de tiempo con precisión de mes. En nuestra base de datos, el reloj inteligente tiene la fecha de producción '2019-09-15 07:35:13'; ahora es '2019-09-01 00:00:00' , que es el primer día del mes.