実現したいこと
次のようなデータがある場合
id | group_id | value_number | registed |
---|---|---|---|
1 | 1 | 11 | 2025-08-01 |
2 | 2 | 21 | 2025-08-01 |
3 | 1 | 12 | 2025-10-01 |
4 | 1 | 13 | 2025-08-01 |
5 | 1 | 14 | 2025-08-01 |
6 | 2 | 22 | 2025-09-01 |
id:6のregistedを「2025-10-01」から「2025-09-01」に修正しました。
指定された日付までの登録データの中で、グループ毎に最新の値が取得したいです。
同一のグループで同一の日付に複数の登録がある場合は、後から登録されたもの(idが大きいもの)を取得したいと考えています。
なお、登録は必ずしも日付順ではない為、idの大きいなものにより古い日付のデータが登録される事もあります。
日付の閾値として「2025-10-01」が指定された場合は以下のような結果を期待します。
id | group_id | value_number | registed |
---|---|---|---|
3 | 1 | 12 | 2025-10-01 |
6 | 2 | 22 | 2025-09-01 |
id:6の内容修正に伴い期待する取得結果も修正しました
日付の閾値として「2025-08-01」が指定された場合は以下のような結果を期待すます。
id | group_id | value_number | registed |
---|---|---|---|
5 | 1 | 14 | 2025-08-01 |
2 | 2 | 21 | 2025-08-01 |
このような結果を期待していますが、うまく取得する方法が思いつきません。
発生している問題・分からないこと
SQLだけで結果を取得する事が難しい場合は、諦めて一度全件取得しプログラム側の個別の集計処理も考えています。
何か良い方法はありますでしょうか。
試したこと・調べたこと
- teratailやGoogle等で検索した
上記の詳細・結果
多くの場合で、登録されるデータとして必ず新しいものが後に登録される(idが大きい)ケースはあり、参考になるのですが、今回のように必ずしもidが大きなものが新しい日付でない場合は上手く取得できませんでした。
試したSQL(微妙に上手くいっていないケース)
SQL
1SELECT 2`group_id`, 3`id`, 4MAX(registed) AS `latestDate` 5FROM 6`hoge` 7WHERE 8`registed` <= '2025-08-01' 9GROUP BY 10`group_id` 11;
これですと2つ目のケースのグループ2が正常に新しいレコードが取得できません。
なお、MySQLでのSTRICT制約は外しています。
補足1
元データの id:6の内容修正に伴い期待する取得結果も修正しました。
閾値として設定された日付より前に登録されたデータの内、より後に登録されたものを取得したい為。

回答4件
あなたの回答
tips
プレビュー