Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Gruppieren Sie nach Woche in MySQL

Zwei Schritte dazu:

Erstens benötigen Sie eine Operation zum Abschneiden der Woche, die Ihre DATETIME benötigt Artikel und geben Sie Mitternacht am vorangehenden Sonntag zurück (wenn Ihre Geschäftsregel besagt, dass die Woche am Sonntag beginnt).

Daraus wird ein geeignetes GROUP BY-Element. Der WEEK() / YEAR() Hack ist dafür nicht geeignet. Es macht in der letzten/ersten Woche jedes Jahres wirklich ein Chaos.

Meiner Erfahrung nach wird dieser Ausdruck den Wochen-Truncate-Trick für Sie erledigen, Sonntag - Samstag,

  FROM_DAYS(TO_DAYS(TIMESTAMP) -MOD(TO_DAYS(TIMESTAMP) -1, 7))

Verwenden Sie diesen Ausdruck, um Wochen von Montag bis Sonntag zu erhalten.

  FROM_DAYS(TO_DAYS(TIMESTAMP) -MOD(TO_DAYS(TIMESTAMP) -2, 7))

So können Sie dies tun.

  SELECT COUNT(whatever), SUM(whatelse),
         FROM_DAYS(TO_DAYS(event_time) -MOD(TO_DAYS(event_time) -1, 7)) as WEEKSTART,
    FROM TABLE
   GROUP BY FROM_DAYS(TO_DAYS(event_time) -MOD(TO_DAYS(event_time) -1, 7))

Wie kann man in MySQL nach Woche gruppieren?

Zweitens müssen Sie diesem abgeschnittenen Datum sechs Tage hinzufügen, damit Sie den letzten Tag jeder Woche zusammen mit dem ersten Tag anzeigen können.

Dies ist eine gute Möglichkeit, dies mit einer verschachtelten Abfrage zu tun

SELECT whats, elses, weekstart, weekstart + INTERVAL 6 DAY AS weekend
  FROM (
  SELECT COUNT(whatever) AS whats, SUM(whatelse) AS elses,
         FROM_DAYS(TO_DAYS(event_time) -MOD(TO_DAYS(event_time) -1, 7)) AS weekstart,
    FROM TABLE
   GROUP BY FROM_DAYS(TO_DAYS(event_time) -MOD(TO_DAYS(event_time) -1, 7))
  ) AS summary
ORDER BY weekstart

Machen Sie viel davon? Ich schlage vor, Sie erstellen eine gespeicherte TRUNC_WEEK Funktion.