select to_char(date,'Mon') as mon,
extract(year from date) as yyyy,
sum("Sales") as "Sales"
from yourtable
group by 1,2
À la demande de Radu, j'expliquerai cette requête:
to_char(date,'Mon') as mon,
: convertit l'attribut "date" dans le format défini de la forme abrégée du mois.
extract(year from date) as yyyy
: La fonction "extraire" de PostgreSQL est utilisée pour extraire l'année AAAA de l'attribut "date".
sum("Sales") as "Sales"
: La fonction SOMME () additionne toutes les valeurs "Ventes" et fournit un alias sensible à la casse, avec le respect de la casse en utilisant des guillemets doubles.
group by 1,2
: La fonction GROUP BY doit contenir toutes les colonnes de la liste SELECT qui ne font pas partie de l'agrégat (c'est-à-dire toutes les colonnes ne figurant pas dans les fonctions SUM / AVG / MIN / MAX, etc.). Cela indique à la requête que le SUM () doit être appliqué pour chaque combinaison unique de colonnes, qui dans ce cas sont les colonnes du mois et de l'année. La partie "1,2" est un raccourci au lieu d'utiliser les alias de colonne, bien qu'il soit probablement préférable d'utiliser les expressions complètes "to_char (...)" et "extract (...)" pour la lisibilité.
date_trunc
n'est pas exactement ce que le demandeur voulait:select date_trunc('month', timestamp '2001-02-16 20:38:40')::date
=>2001-02-01
date_trunc
dans l'group by
article.Je ne peux pas croire que la réponse acceptée a autant de votes positifs - c'est une méthode horrible.
Voici la bonne façon de le faire, avec date_trunc :
C'est une mauvaise pratique mais vous pourriez être pardonné si vous utilisez
dans une requête très simple.
Vous pouvez aussi utiliser
si vous ne souhaitez pas sélectionner la date.
la source
date_trunc
n'est pas ce que le demandeur attendait: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
a été créé exactement dans ce but. il n'y a aucune raison de créer deux colonnesto_char
vous permet en fait de sortir l'année et le mois d'un seul coup!ou dans le cas de l'exemple de l'utilisateur ci-dessus:
la source
date_trunc
méthode lors de l'exécution du groupe par. Expérimenter sur une base de données que j'ai à portée de main, sur une table de 270 000 lignes, la méthode date_trunc est plus de deux fois la vitesse de TO_CHARIl existe une autre façon d'obtenir le résultat en utilisant la fonction date_part () dans postgres.
Merci
la source
La réponse bma est géniale! Je l'ai utilisé avec ActiveRecords, le voici si quelqu'un en a besoin dans Rails:
la source
yourscopeorclass.group("extract(year from tablename.colname)")
et vous pouvez enchaîner cela 3 fois pour obtenir l'année, le mois, le jourJetez un œil à l'exemple E de ce tutoriel -> https://www.postgresqltutorial.com/postgresql-group-by/
Vous devez appeler la fonction sur votre GROUP BY au lieu d'appeler le nom de l'attribut virtuel que vous avez créé lors de la sélection. Je faisais ce que toutes les réponses ci-dessus recommandaient et j'obtenais une
column 'year_month' does not exist
erreur.Ce qui a fonctionné pour moi était:
la source
Postgres a quelques types d'horodatages:
horodatage sans fuseau horaire - (préférable pour stocker les horodatages UTC) Vous le trouvez dans le stockage de base de données multinational. Le client dans ce cas se chargera du décalage du fuseau horaire pour chaque pays.
horodatage avec fuseau horaire - Le décalage du fuseau horaire est déjà inclus dans l'horodatage.
Dans certains cas, votre base de données n'utilise pas le fuseau horaire, mais vous devez tout de même regrouper les enregistrements en fonction du fuseau horaire local et de l'heure d'été (par exemple https://www.timeanddate.com/time/zone/romania/bucharest )
Pour ajouter un fuseau horaire, vous pouvez utiliser cet exemple et remplacer le décalage du fuseau horaire par le vôtre.
Pour ajouter le décalage d'heure d'été +1 spécifique à DST, vous devez vérifier si votre horodatage correspond à un DST d'été. Comme ces intervalles varient avec 1 ou 2 jours, j'utiliserai une approximation qui n'affecte pas les enregistrements de fin de mois, donc dans ce cas, je peux ignorer chaque intervalle exact de l'année.
Si une requête plus précise doit être créée, vous devez ajouter des conditions pour créer plus de cas. Mais en gros, cela fonctionnera bien pour diviser les données par mois en fonction du fuseau horaire et de l'heure d'été lorsque vous trouvez un horodatage sans fuseau horaire dans votre base de données:
la source