Ist es möglich, eine einfache Abfrage durchzuführen, um zu zählen, wie viele Datensätze ich in einem bestimmten Zeitraum wie einem Jahr, einem Monat oder einem Tag habe und ein TIMESTAMP
Feld habe, wie z.
SELECT COUNT(id)
FROM stats
WHERE record_date.YEAR = 2009
GROUP BY record_date.YEAR
Oder auch:
SELECT COUNT(id)
FROM stats
GROUP BY record_date.YEAR, record_date.MONTH
Eine monatliche Statistik haben.
Vielen Dank!
GROUP BY record_date.MONTH
in Ihrem ersten Code-Snippet sein?Antworten:
Überprüfen Sie die Datums- und Uhrzeitfunktionen in MySQL.
quelle
SELECT count(*), record_date FROM anytable WHERE anytable.anycolumn = 'anycondition' GROUP BY YEAR(record_date), month(record_date);
Hinweis: record_date ist ein Datumstyp TIMESTAMPHinweis (hauptsächlich für potenzielle Downvoter). Derzeit ist dies möglicherweise nicht so effizient wie andere Vorschläge. Trotzdem lasse ich es als Alternative und auch als eine, die dazu beitragen kann, zu sehen, wie schneller andere Lösungen sind. (Denn man kann nicht wirklich schnell von langsam unterscheiden, bis man den Unterschied sieht.) Im Laufe der Zeit könnten auch Änderungen an der MySQL-Engine in Bezug auf die Optimierung vorgenommen werden, um diese Lösung bei einigen (vielleicht auch nicht) zu machen entfernt) Punkt in der Zukunft, um in der Effizienz mit den meisten anderen vergleichbar zu werden.
quelle
EXTRACT()
möglicherweise effizienter alsDATE_FORMAT()
. (Ich habe jedoch kein MySQL für ordnungsgemäße Tests.)Probier diese
Die EXTRACT-Funktion (Einheit ab Datum) ist besser, da weniger Gruppierungen verwendet werden und die Funktion einen Zahlenwert zurückgibt.
Die Vergleichsbedingung beim Gruppieren ist schneller als die Funktion DATE_FORMAT (die einen Zeichenfolgenwert zurückgibt). Versuchen Sie, das Feld function | zu verwenden, das einen Wert ohne Zeichenfolge für die SQL-Vergleichsbedingung zurückgibt (WHERE, HAVING, ORDER BY, GROUP BY).
quelle
Ich habe versucht, die obige 'WHERE'-Anweisung zu verwenden. Ich dachte, sie ist korrekt, da niemand sie korrigiert hat, aber ich habe mich geirrt. Nach einigen Suchen habe ich herausgefunden, dass dies die richtige Formel für die WHERE-Anweisung ist, sodass der Code folgendermaßen aussieht:
quelle
Wenn Ihre Suche mehrere Jahre dauert und Sie dennoch monatlich gruppieren möchten, schlage ich vor:
Version 1:
Version 2 (effizienter) :
Ich habe diese Versionen auf einer großen Tabelle mit 1.357.918 Zeilen verglichen (innodb), und die 2. Version scheint bessere Ergebnisse zu haben.
version1 (Durchschnitt von 10 führt) : 1,404 Sekunden
version2 (Durchschnitt von 10 führt) : 0,780 Sekunden
(
SQL_NO_CACHE
Schlüssel hinzugefügt, um zu verhindern, dass MySQL bei Abfragen CACHING.)quelle
GROUP BY YEAR(record_date)*100 + MONTH(record_date)
, aber warum nicht auch testenGROUP BY YEAR(record_date), MONTH(record_date)
?*100
auf der Versión # 2? Danke im Voraus.*100
zuYEAR(record_date)*100 + MONTH(record_date) == DATE_FORMAT(record_date, '%Y%m')
Wenn Sie in MySQL nach Datum gruppieren möchten, verwenden Sie den folgenden Code:
Hoffe, das spart etwas Zeit für diejenigen, die diesen Thread finden werden.
quelle
MONTH(record_date)
um mehrere Monate zu berücksichtigen.Wenn Sie Datensätze für ein bestimmtes Jahr (z. B. 2000) filtern möchten, optimieren Sie die
WHERE
Klausel wie folgt:Anstatt:
Die Ergebnisse wurden anhand einer Tabelle generiert, die 300.000 Zeilen und eine Index-On-Date-Spalte enthielt.
In
GROUP BY
Bezug auf die Klausel habe ich die drei Varianten anhand der oben genannten Tabelle getestet. Hier sind die Ergebnisse:Der letzte ist der Gewinner.
quelle
Komplette und einfache Lösung mit ähnlich leistungsfähiger, aber kürzerer und flexiblerer Alternative, die derzeit aktiv ist:
quelle
Wenn Sie eine monatliche Statistik mit Zeilenzahlen pro Monat eines jeden Jahres erhalten möchten, die nach dem letzten Monat sortiert sind, versuchen Sie Folgendes:
quelle
Sie können dies einfach mit der Funktion Mysql DATE_FORMAT () in GROUP BY tun . In einigen Fällen möchten Sie möglicherweise eine zusätzliche Spalte hinzufügen, um die Übersichtlichkeit zu verbessern, z. B. wenn Datensätze mehrere Jahre umfassen und derselbe Monat in verschiedenen Jahren auftritt. Hier können Sie so viele Optionen anpassen. Bitte lesen Sie dies vor dem Start. Hoffe es sollte sehr hilfreich für dich sein. Hier ist eine Beispielabfrage für Ihr Verständnis
quelle
Die folgende Abfrage hat in Oracle Database 12c Release 12.1.0.1.0 für mich funktioniert
quelle
Ich bevorzuge es, die einjährige Gruppenauswahl so zu optimieren:
Auf diese Weise können Sie das Jahr nur einmal binden, z. B.
'2009'
mit einem benannten Parameter, und müssen sich nicht um das Hinzufügen'-01-01'
oder Übergeben'2010'
separat kümmern .Da wir vermutlich nur Zeilen zählen und dies
id
niemals tunNULL
, ziehe ich esCOUNT(*)
vorCOUNT(id)
.quelle
.... group by to_char(date, 'YYYY')
-> 1989.... group by to_char(date,'MM')
-> 05.... group by to_char(date,'DD')
---> 23.... group by to_char(date,'MON')
---> MAI.... group by to_char(date,'YY')
---> 89quelle