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.