select to_char(date,'Mon') as mon,
extract(year from date) as yyyy,
sum("Sales") as "Sales"
from yourtable
group by 1,2
Auf Wunsch von Radu werde ich diese Frage erläutern:
to_char(date,'Mon') as mon,
: konvertiert das Attribut "Datum" in das definierte Format der Kurzform des Monats.
extract(year from date) as yyyy
: Mit der Funktion "Extrahieren" von Postgresql wird das JJJJ-Jahr aus dem Attribut "Datum" extrahiert.
sum("Sales") as "Sales"
: Die Funktion SUM () addiert alle "Sales" -Werte und liefert einen Alias für Groß- und Kleinschreibung, wobei die Groß- und Kleinschreibung durch doppelte Anführungszeichen beibehalten wird.
group by 1,2
: Die GROUP BY-Funktion muss alle Spalten aus der SELECT-Liste enthalten, die nicht Teil des Aggregats sind (auch bekannt als alle Spalten, die nicht in den Funktionen SUM / AVG / MIN / MAX usw. enthalten sind). Dies teilt der Abfrage mit, dass SUM () für jede eindeutige Kombination von Spalten angewendet werden soll, in diesem Fall die Spalten für Monat und Jahr. Der Teil "1,2" ist eine Abkürzung anstelle der Verwendung der Spaltenaliasnamen, obwohl es wahrscheinlich am besten ist, die vollständigen Ausdrücke "to_char (...)" und "extract (...)" für die Lesbarkeit zu verwenden.
date_trunc
ist nicht genau das, was der Fragesteller wollte:select date_trunc('month', timestamp '2001-02-16 20:38:40')::date
=>2001-02-01
date_trunc
in dergroup by
Klausel zu verwenden.Ich kann nicht glauben, dass die akzeptierte Antwort so viele positive Stimmen hat - es ist eine schreckliche Methode.
Hier ist der richtige Weg, dies mit date_trunc zu tun :
Es ist eine schlechte Praxis, aber Sie könnten vergeben werden, wenn Sie verwenden
in einer sehr einfachen Abfrage.
Sie können auch verwenden
wenn Sie das Datum nicht auswählen möchten.
quelle
date_trunc
nicht dem, was der Fragesteller erwartet hat: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
wurde genau für diesen Zweck erstellt. Es gibt keinen Grund, zwei Spalten zu erstellento_char
Tatsächlich können Sie das Jahr und den Monat auf einen Schlag herausholen!oder im Fall des obigen Benutzerbeispiels:
quelle
date_trunc
Methode, wenn die Gruppe von ausgeführt wird. Experimentieren mit einer Datenbank Ich habe es zur Hand, in einer Tabelle mit 270.000 Zeilen ist die date_trunc-Methode mehr als doppelt so schnell wie TO_CHAREs gibt eine andere Möglichkeit, das Ergebnis mit der Funktion date_part () in postgres zu erzielen.
Vielen Dank
quelle
bma Antwort ist großartig! Ich habe es mit ActiveRecords verwendet. Hier ist es, wenn jemand es in Rails benötigt:
quelle
yourscopeorclass.group("extract(year from tablename.colname)")
und du kannst das dreimalSchauen Sie sich Beispiel E dieses Tutorials an -> https://www.postgresqltutorial.com/postgresql-group-by/
Sie müssen die Funktion in Ihrer GROUP BY aufrufen, anstatt den Namen des virtuellen Attributs aufzurufen, das Sie bei select erstellt haben. Ich habe getan, was alle oben genannten Antworten empfohlen haben, und es wurde ein
column 'year_month' does not exist
Fehler angezeigt.Was für mich funktioniert hat war:
quelle
Postgres hat nur wenige Arten von Zeitstempeln:
Zeitstempel ohne Zeitzone - (Vorzugsweise zum Speichern von UTC-Zeitstempeln) Sie finden ihn im multinationalen Datenbankspeicher. In diesem Fall kümmert sich der Kunde um den Zeitzonenversatz für jedes Land.
Zeitstempel mit Zeitzone - Der Zeitzonenversatz ist bereits im Zeitstempel enthalten.
In einigen Fällen verwendet Ihre Datenbank die Zeitzone nicht, Sie müssen jedoch Datensätze in Bezug auf die lokale Zeitzone und die Sommerzeit gruppieren (z. B. https://www.timeanddate.com/time/zone/romania/bucharest ).
Um eine Zeitzone hinzuzufügen, können Sie dieses Beispiel verwenden und den Zeitzonenversatz durch Ihren ersetzen.
Um den für die Sommerzeit spezifischen Versatz von +1 Sommerzeit hinzuzufügen, müssen Sie überprüfen, ob Ihr Zeitstempel in eine Sommerzeit fällt. Da diese Intervalle mit 1 oder 2 Tagen variieren, verwende ich eine Annäherung, die die Aufzeichnungen zum Monatsende nicht beeinflusst. In diesem Fall kann ich jedes Jahr das genaue Intervall ignorieren.
Wenn eine genauere Abfrage erstellt werden muss, müssen Sie Bedingungen hinzufügen, um weitere Fälle zu erstellen. In etwa funktioniert dies jedoch gut, wenn Sie Daten pro Monat in Bezug auf Zeitzone und Sommerzeit aufteilen, wenn Sie einen Zeitstempel ohne Zeitzone in Ihrer Datenbank finden:
quelle