環境
- windows10
- macOS Monterey 12.0.1
- DockerDesktop 4.6.1
- mysql8.0
結論
解法としては、以下の流れです。
- 週でグルーピングしたい日付カラムに対して、WEEKDAY関数を使用してその日付の曜日indexを得る(月曜日始まりの 0: Monday、・・・6:Sunday)
- SUBDATE関数の第一引数にその日付を、第二引数にその日付の曜日indexを指定することで、その日付と同じ週の頭の日付けを取得することが可能
- あとは、2.で取得したその日付と同じ週の頭の日付けでgroup byすれば完成
詳細
曜日indexを得る
5月13日は金曜日なので、曜日indexは4
SELECT WEEKDAY('2022-05-13') -- 4
週の頭の日付けを得る
SUBDATE関数の第2引数を数値で指定すると、第1引数から第2引数分を減算した日付が得られる(与えた日付と同じ週の頭の日付)
SELECT SUBDATE('2022-05-13', WEEKDAY('2022-05-13')) -- 2022-05-09
週の頭の日付けごとにグルーピング
あとは、各週の週の頭の日付でGROUP BYすれば完了
SELECT
SUBDATE(hoge_date, WEEKDAY(hoge_date)) as week,
COUNT(*)
FROM HOGES
GROUP BY week
おまけ
曜日インデックスを返す関数として、DAYOFWEEKというのもあるが、こちらは
日曜日かつ1始まり(1 = Sunday 、2 = Monday 、・・・7 = Saturday)となっている
まとめ
いかがでしたでしょうか。本記事では、MySQLで週毎にグルーピングする方法について紹介しています。ぜひ参考にしてみて下さい