it-swarm.com.de

MySQL Query GROUP BY Tag / Monat / Jahr

Ist es möglich, dass ich eine einfache Abfrage mache, um zu zählen, wie viele Datensätze ich in einem bestimmten Zeitraum wie einem Jahr, Monat oder Tag habe, mit einem TIMESTAMP -Feld wie:

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!

592
GROUP BY YEAR(record_date), MONTH(record_date)

Check out the Datum und Uhrzeit Funktionen in MySQL.

932
codelogic
GROUP BY DATE_FORMAT(record_date, '%Y%m')

Hinweis (hauptsächlich an potenzielle Abwähler). Derzeit ist dies möglicherweise nicht so effizient wie andere Vorschläge. Trotzdem lasse ich es als Alternative und auch als Alternative, um zu sehen, wie schnell 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 manchen (vielleicht auch nicht so) zu erreichen entfernt) Punkt in der Zukunft, um in der Effizienz mit den meisten anderen durchaus vergleichbar zu werden.

213
Andriy M

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 stellte ich fest, dass dies die richtige Formel für die WHERE-Anweisung ist, sodass der Code folgendermaßen aussieht:

SELECT COUNT(id)  
FROM stats  
WHERE YEAR(record_date) = 2009  
GROUP BY MONTH(record_date)
40
dimazaid

probier diese

SELECT COUNT(id)
FROM stats
GROUP BY EXTRACT(YEAR_MONTH FROM record_date)

EXTRACT (Einheit FROM date) Funktion 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 es mit dem Feld function |, das einen Nicht-String-Wert für die SQL-Vergleichsbedingung zurückgibt (WHERE, HAVING, ORDER BY, GROUP BY).

39
fu-chi

Wenn Ihre Suche über mehrere Jahre dauert und Sie trotzdem monatlich eine Gruppe bilden möchten, schlage ich vor:

Version 1:

SELECT SQL_NO_CACHE YEAR(record_date), MONTH(record_date), COUNT(*)
FROM stats
GROUP BY DATE_FORMAT(record_date, '%Y%m')

Version 2 (effizienter) :

SELECT SQL_NO_CACHE YEAR(record_date), MONTH(record_date), COUNT(*)
FROM stats
GROUP BY YEAR(record_date)*100 + MONTH(record_date)

Ich habe diese Versionen auf einem großen Tisch mit 1.357.918 Zeilen ( innodb ) verglichen, und die 2. Version scheint bessere Ergebnisse zu haben.

version1 (durchschnittlich 10 Ausführungen) : 1,404 Sekunden
Version2 (Durchschnitt von 10 Ausführungen) : 0,780 Sekunden

(SQL_NO_CACHE Schlüssel hinzugefügt, um zu verhindern, dass MySQL bei Abfragen CACHING ausführt.)

25
mr.baby123

Wenn Sie in MySQL nach Datum gruppieren möchten, verwenden Sie den folgenden Code:

 SELECT COUNT(id)
 FROM stats
 GROUP BY DAYOFMONTH(record_date)

Ich hoffe, dies spart denjenigen, die diesen Thread finden werden, etwas Zeit.

16
Haijerome

Wenn Sie Datensätze für ein bestimmtes Jahr (z. B. 2000) filtern möchten, optimieren Sie die WHERE -Klausel wie folgt:

SELECT MONTH(date_column), COUNT(*)
FROM date_table
WHERE date_column >= '2000-01-01' AND date_column < '2001-01-01'
GROUP BY MONTH(date_column)
-- average 0.016 sec.

Anstatt von:

WHERE YEAR(date_column) = 2000
-- average 0.132 sec.

Die Ergebnisse wurden anhand einer Tabelle generiert, die 300.000 Zeilen und einen Index für die Datumsspalte enthielt.

In Bezug auf die GROUP BY -Klausel habe ich die drei Varianten anhand der oben genannten Tabelle getestet. Hier sind die Ergebnisse:

SELECT YEAR(date_column), MONTH(date_column), COUNT(*)
FROM date_table
GROUP BY YEAR(date_column), MONTH(date_column)
-- codelogic
-- average 0.250 sec.

SELECT YEAR(date_column), MONTH(date_column), COUNT(*)
FROM date_table
GROUP BY DATE_FORMAT(date_column, '%Y%m')
-- Andriy M
-- average 0.468 sec.

SELECT YEAR(date_column), MONTH(date_column), COUNT(*)
FROM date_table
GROUP BY EXTRACT(YEAR_MONTH FROM date_column)
-- fu-chi
-- average 0.203 sec.

Der letzte ist der Gewinner.

12
Salman A

Komplette und einfache Lösung mit ähnlich leistungsfähiger, jedoch kürzerer und flexiblerer Alternative, die derzeit aktiv ist:

SELECT COUNT(*) FROM stats
-- GROUP BY YEAR(record_date), MONTH(record_date), DAYOFMONTH(record_date)
GROUP BY DATE_FORMAT(record_date, '%Y-%m-%d')
10
Cees Timmerman

Wenn Sie eine monatliche Statistik mit Zeilenzahlen pro Monat eines jeden Jahres abrufen möchten, die nach dem letzten Monat sortiert sind, versuchen Sie Folgendes:

SELECT count(id),
      YEAR(record_date),
      MONTH(record_date) 
FROM `table` 
GROUP BY YEAR(record_date),
        MONTH(record_date) 
ORDER BY YEAR(record_date) DESC,
        MONTH(record_date) DESC
7
user3019799

Sie können dies einfach tun Mysql DATE_FORMAT () Funktion in GROUP BY. 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. Sie können dies bei so vielen Optionen anpassen. Bitte lesen Sie dies, bevor Sie beginnen. Hoffe, es sollte sehr hilfreich für Sie sein. Hier ist eine Beispielabfrage für Ihr Verständnis

SELECT
    COUNT(id),
    DATE_FORMAT(record_date, '%Y-%m-%d') AS DAY,
    DATE_FORMAT(record_date, '%Y-%m') AS MONTH,
    DATE_FORMAT(record_date, '%Y') AS YEAR,

FROM
    stats
WHERE
    YEAR = 2009
GROUP BY
    DATE_FORMAT(record_date, '%Y-%m-%d ');
6
Faisal

Die folgende Abfrage hat für mich in Oracle Database 12c Release 12.1.0.1.0 funktioniert

SELECT COUNT(*)
FROM stats
GROUP BY 
extract(MONTH FROM TIMESTAMP),
extract(MONTH FROM TIMESTAMP),
extract(YEAR  FROM TIMESTAMP);
4
Minisha

Ich ziehe es vor, die einjährige Gruppenauswahl wie folgt zu optimieren:

SELECT COUNT(*)
  FROM stats
 WHERE record_date >= :year 
   AND record_date <  :year + INTERVAL 1 YEAR;

Auf diese Weise können Sie das Jahr nur einmal binden, z. '2009' mit einem benannten Parameter und Sie müssen sich nicht darum kümmern, '-01-01' hinzuzufügen oder '2010' separat zu übergeben.

Da wir vermutlich nur Zeilen zählen und id niemals NULL ist, ziehe ich COUNT(*)COUNT(id) vor.

2
Arth

.... 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') ---> 89

0
aromita sen