sql >> Databáze >  >> RDS >> Mysql

Seskupit po týdnech v MySQL

Dva kroky k tomu:

Za prvé, potřebujete týdenní operaci zkrácení -- to bude trvat DATETIME položku a vrátit půlnoc předchozí neděle (pokud vaše obchodní pravidlo říká, že týden začíná v neděli).

To se stane vhodnou položkou GROUP BY. Hack WEEK() / YEAR() k tomu není vhodný. Poslední/první týden každého roku to opravdu dělá nepořádek.

Podle mých zkušeností vám tento výraz udělá trik se zkrácením týdne, neděle – sobota,

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

Chcete-li získat týdny pondělí až neděle, použijte tento výraz.

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

Takže to můžete udělat.

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

Jak seskupit podle týdne v MySQL?

Za druhé, musíte k tomuto zkrácenému datu přidat šest dní, abyste mohli zobrazit poslední den každého týdne spolu s prvním dnem.

Je to dobrý způsob, jak toho dosáhnout, pomocí vnořeného dotazu

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

Děláte toho hodně? Navrhuji, abyste si vytvořili uložený TRUNC_WEEK funkce.




  1. Jak vytvořit kaskádové rozevírací seznamy pomocí mysql a php

  2. Uzamčení databáze MySQL tak, aby dotaz mohla spustit pouze jedna osoba?

  3. Zkontrolujte, zda existuje databáze (MySQL) a pokud ne, vytvořte ji v PHP

  4. MySQL a vnořená sada:pomalé JOIN (bez použití indexu)