sql >> Database >  >> RDS >> Mysql

Groeperen per week in MySQL

Twee stappen hiertoe:

Ten eerste heb je een week-afkapbewerking nodig -- dat kost je DATETIME item en geef de vorige zondag middernacht terug (als uw bedrijfsregel zegt dat de week op zondag begint).

Dat wordt een geschikt GROUP BY item. De WEEK() / YEAR() hack is hier niet geschikt voor. Het maakt echt een puinhoop in de laatste/eerste week van elk jaar.

In mijn ervaring zal deze uitdrukking de week-afkap-truc voor je doen, zondag - zaterdag,

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

Gebruik deze uitdrukking om maandag - zondag weken te krijgen.

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

Dus je kunt dit doen.

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

Hoe groeperen op week in MySQL?

Ten tweede moet je zes dagen toevoegen aan die ingekorte datum, zodat je de laatste dag van elke week samen met de eerste dag kunt weergeven.

Dit is een goede manier om dat te doen, met een geneste zoekopdracht

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

Doe je dit veel? Ik stel voor dat je een opgeslagen TRUNC_WEEK . maakt functie.




  1. UPDATE met SELECT, zal het elke rij of alle GESELECTEERDE records vergrendelen?

  2. Rijwaarden samenvoegen T-SQL

  3. Grondbeginselen van tabeluitdrukkingen, deel 10 - Weergaven, SELECT * en DDL-wijzigingen

  4. MySQL-berekening van cumulatieve som met een reset-voorwaarde