Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Agrupar por semana no MySQL


Dois passos para isso:

Primeiro, você precisa de uma operação de truncar de semana -- que levará seu DATETIME item e devolver meia-noite no domingo anterior (se sua regra de negócios disser que a semana começa no domingo).

Isso se torna um item GROUP BY adequado. O hack WEEK() / YEAR() não é adequado para isso. Realmente faz uma bagunça na última/primeira semana de cada ano.

Na minha experiência, essa expressão fará o truque de truncar a semana para você, domingo - sábado,
  FROM_DAYS(TO_DAYS(TIMESTAMP) -MOD(TO_DAYS(TIMESTAMP) -1, 7))

Para obter as semanas de segunda a domingo, use esta expressão.
  FROM_DAYS(TO_DAYS(TIMESTAMP) -MOD(TO_DAYS(TIMESTAMP) -2, 7))

Então você pode fazer isso.
  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))

Como agrupar por semana no MySQL?

Segundo, você precisa adicionar seis dias a essa data truncada, para poder exibir o último dia de cada semana junto com o primeiro dia.

Esta é uma boa maneira de fazer isso, com uma consulta aninhada
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

Fazendo muito isso? Sugiro que você crie um TRUNC_WEEK armazenado função.