sql >> Base de Datos >  >> RDS >> Mysql

Agrupar por semana en MySQL

Dos pasos para esto:

Primero, necesita una operación de truncamiento de una semana, que tomará su DATETIME artículo y devuélvalo a la medianoche del domingo anterior (si su regla comercial dice que la semana comienza el domingo).

Eso se convierte en un elemento adecuado de GROUP BY. El hack WEEK() / YEAR() no es adecuado para esto. Realmente hace un lío en la última/primera semana de cada año.

En mi experiencia, esta expresión hará el truco de truncar la semana, de domingo a sábado,

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

Para obtener las semanas de lunes a domingo, utilice esta expresión.

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

Así que puedes hacer esto.

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

¿Cómo agrupar por semana en MySQL?

En segundo lugar, debe agregar seis días a esa fecha truncada, de modo que pueda mostrar el último día de cada semana junto con el primer día.

Esta es una buena forma de hacerlo, con una consulta anidada

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

¿Haciendo mucho de esto? Le sugiero que cree un TRUNC_WEEK almacenado función.