select to_char(date,'Mon') as mon,
extract(year from date) as yyyy,
sum("Sales") as "Sales"
from yourtable
group by 1,2
A petición de Radu, explicaré esa consulta:
to_char(date,'Mon') as mon,
: convierte el atributo "fecha" en el formato definido de la forma abreviada del mes.
extract(year from date) as yyyy
: La función "extraer" de Postgresql se utiliza para extraer el año AAAA del atributo "fecha".
sum("Sales") as "Sales"
: La función SUMA () suma todos los valores de "Ventas" y proporciona un alias que distingue entre mayúsculas y minúsculas, manteniendo la distinción entre mayúsculas y minúsculas mediante comillas dobles.
group by 1,2
: La función GROUP BY debe contener todas las columnas de la lista SELECT que no forman parte del agregado (es decir, todas las columnas que no están dentro de las funciones SUM / AVG / MIN / MAX, etc.). Esto le dice a la consulta que el SUM () debe aplicarse para cada combinación única de columnas, que en este caso son las columnas de mes y año. La parte "1,2" es una abreviatura en lugar de usar los alias de columna, aunque probablemente sea mejor usar las expresiones completas "to_char (...)" y "extract (...)" para facilitar la lectura.
date_trunc
no es exactamente lo que el autor de la pregunta quería:select date_trunc('month', timestamp '2001-02-16 20:38:40')::date
=>2001-02-01
date_trunc
en lagroup by
cláusula.No puedo creer que la respuesta aceptada tenga tantos votos positivos, es un método horrible.
Aquí está la forma correcta de hacerlo, con date_trunc :
Es una mala práctica, pero puede ser perdonado si usa
en una consulta muy simple
También puedes usar
si no quieres seleccionar la fecha.
fuente
date_trunc
no es lo que el autor de la pregunta esperaba: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
fue creado para este propósito exacto. no hay razón para crear dos columnasto_char
en realidad te permite sacar el año y el mes de una sola vez!o en el caso del ejemplo del usuario anterior:
fuente
date_trunc
método cuando se realiza el grupo por. Experimentando en un DB que tengo a mano, en una mesa con 270k filas, el método date_trunc supera el doble de la velocidad de TO_CHARHay otra forma de lograr el resultado utilizando la función date_part () en postgres.
Gracias
fuente
bma respuesta es genial! Lo he usado con ActiveRecords, aquí está si alguien lo necesita en Rails:
fuente
yourscopeorclass.group("extract(year from tablename.colname)")
y puede encadenarlo 3 veces para obtener año, mes, díaEche un vistazo al ejemplo E de este tutorial -> https://www.postgresqltutorial.com/postgresql-group-by/
Debe llamar a la función en su GROUP BY en lugar de llamar al nombre del atributo virtual que creó en select. Estaba haciendo lo que todas las respuestas anteriores recomendaban y recibía un
column 'year_month' does not exist
error.Lo que funcionó para mí fue:
fuente
Postgres tiene pocos tipos de marcas de tiempo:
marca de tiempo sin zona horaria - (Preferible para almacenar marcas de tiempo UTC) Lo encuentra en el almacenamiento de bases de datos multinacionales. El cliente en este caso se encargará de la compensación de zona horaria para cada país.
marca de tiempo con zona horaria: el desplazamiento de la zona horaria ya está incluido en la marca de tiempo.
En algunos casos, su base de datos no utiliza la zona horaria, pero aún necesita agrupar registros con respecto a la zona horaria local y el horario de verano (por ejemplo, https://www.timeanddate.com/time/zone/romania/bucharest )
Para agregar una zona horaria, puede usar este ejemplo y reemplazar el desplazamiento de la zona horaria con el suyo.
Para agregar el desplazamiento de horario de verano +1 específico para el horario de verano, debe verificar si su marca de tiempo cae en un horario de verano. Como esos intervalos varían con 1 o 2 días, usaré una aproximación que no afecta los registros de fin de mes, por lo que en este caso puedo ignorar el intervalo exacto de cada año.
Si se debe generar una consulta más precisa, debe agregar condiciones para crear más casos. Pero más o menos, esto funcionará bien al dividir los datos por mes con respecto a la zona horaria y SummerTime cuando encuentre la marca de tiempo sin zona horaria en su base de datos:
fuente