Mysql
 sql >> Database >  >> RDS >> Mysql

Raggruppa per settimana in MySQL

Due passaggi per questo:

Uno, hai bisogno di un'operazione di troncamento di una settimana, che richiederà il tuo DATETIME articolo e restituisci la mezzanotte della domenica precedente (se la tua regola aziendale dice che la settimana inizia di domenica).

Questo diventa un elemento GROUP BY adatto. L'hack WEEK() / YEAR() non è adatto a questo. Fa davvero un pasticcio nell'ultima/prima settimana di ogni anno.

Nella mia esperienza, questa espressione farà per te il trucco del troncamento della settimana, da domenica a sabato,

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

Per ottenere le settimane dal lunedì alla domenica, usa questa espressione.

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

Quindi puoi farlo.

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

Come raggruppare per settimana in MySQL?

In secondo luogo, devi aggiungere sei giorni a quella data troncata, in modo da poter visualizzare l'ultimo giorno di ogni settimana insieme al primo giorno.

Questo è un buon modo per farlo, con una query nidificata

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

Fare molto di questo? Ti suggerisco di creare un TRUNC_WEEK memorizzato funzione.