Mysql
 sql >> Base de données >  >> RDS >> Mysql

Regrouper par semaine dans MySQL

Deux étapes :

Premièrement, vous avez besoin d'une opération de troncation hebdomadaire – qui prendra votre DATETIME article et restituer minuit le dimanche précédent (si votre règle métier indique que la semaine commence le dimanche).

Cela devient un élément GROUP BY approprié. Le hack WEEK() / YEAR() n'est pas adapté à cela. Cela fait vraiment un gâchis la dernière/première semaine de chaque année.

D'après mon expérience, cette exxpression fera le tour de la semaine pour vous, du dimanche au samedi,

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

Pour obtenir les semaines du lundi au dimanche, utilisez cette expression.

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

Vous pouvez donc le faire.

  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))

Comment regrouper par semaine dans MySQL ?

Deuxièmement, vous devez ajouter six jours à cette date tronquée, afin de pouvoir afficher le dernier jour de chaque semaine avec le premier jour.

C'est un bon moyen de le faire, avec une requête imbriquée

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

Faire beaucoup de cela? Je vous suggère de créer un TRUNC_WEEK stocké fonction.