sql >> Databasteknik >  >> RDS >> Mysql

Gruppera för vecka i MySQL

Två steg till detta:

För det första behöver du en vecka-trunkera operation -- som tar din DATETIME föremål och ge tillbaka midnatt föregående söndag (om din affärsregel säger att veckan börjar på söndag).

Det blir ett passande GROUP BY-objekt. Hacket WEEK() / YEAR() är inte lämpligt för detta. Det gör verkligen oreda den sista/första veckan varje år.

Enligt min erfarenhet kommer det här uttrycket att göra veckans trunkering för dig, söndag - lördag,

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

För att få måndag - söndag veckor, använd detta uttryck.

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

Så du kan göra detta.

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

Hur grupperar man efter vecka i MySQL?

För det andra måste du lägga till sex dagar till det trunkerade datumet, så att du kan visa den sista dagen i varje vecka tillsammans med den första dagen.

Det här är ett bra sätt att göra det, med en kapslad fråga

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

Göra mycket av detta? Jag föreslår att du skapar en lagrad TRUNC_WEEK funktion.




  1. Problem med SQLiteOpenHelper på Android 2.X och 3.X

  2. Skickar +-200 e-postmeddelanden med funktionen php mail() i en loop

  3. Hur skriver man en MYSQL-fråga som returnerar barn kapslade under föräldrar?

  4. Rensa MySQL-frågecache utan att starta om servern