MySQLで週毎にグルーピングする方法

環境

  • windows10
  • macOS Monterey 12.0.1
  • DockerDesktop 4.6.1
  • mysql8.0

結論

解法としては、以下の流れです。

  1. 週でグルーピングしたい日付カラムに対して、WEEKDAY関数を使用してその日付の曜日indexを得る(月曜日始まりの 0: Monday、・・・6:Sunday)
  2. SUBDATE関数の第一引数にその日付を、第二引数にその日付の曜日indexを指定することで、その日付と同じ週の頭の日付けを取得することが可能
  3. あとは、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学習におすすめの書籍

MySQL徹底入門 第4版 MySQL 8.0対応 [ yoku0825 ]
楽天ブックス
¥ 4,180(2022/08/05 21:32時点)
タイトルとURLをコピーしました