【Java】MySQLで月毎の最新データをリストとして取得したい
こんなテーブルから、月毎の最新データのみをリスト化したい。
これを月毎にグループ化できたはいいけど、その各月の最新日時の金額を取得できない。
このやり方だと、月毎の集計金額や最小、最大の金額は取得できるけど、最新日時に紐づいた金額が取得できない。
GROUP BY に指定していないフィールドを集計関数を通さずに取得することはできないので、sum(price)をpriceにしてもエラーになる。priceと指示されてもMySQLはその月グループにはいくつかpriceがあって、どのpriceを指しているかわからないため。
ちなみに最後に「WITH ROLLUP」をつければ全期間の集計が行える。
気を取り直して同じグループ内で、あるフィールド(作成日)が最大のレコードを取得したい。
別のやり方を試してみる。
こうすることで、テーブル内の全てのデータから最新の情報を取得できた。
しかし全データの最新ではなく各月毎の最新を取得したいのでダメ。。。
各年月のグループ化と、各年月ごとの最新日時が取得できた。この最新日時に紐づくpriceカラムが取得できればOKなのだが、SELECTにpriceを含めてもエラーになってしまう。。
また考え方を変えて...
全データを一旦取得して、同じ年月でのランキング番号をNewRankカラムに取得。このNewRankが1のレコードだけ取得できれば実現できる!
こうすることで各月の無事ランキング一位だけを取得!
SELECT
DATE_FORMAT(created, "%Y%m") as year_and_month,
NewBudget.created,
NewBudget.price
FROM
(
SELECT
ROW_NUMBER() OVER (
PARTITION BY
DATE_FORMAT(created, "%Y%m")
ORDER BY
created DESC
) AS NewRank,
DATE_FORMAT(created, "%Y%m"),
created,
price
FROM
budgets
) AS NewBudget
WHERE
NewBudget.NewRank = 1
ORDER BY
created DESC
むちゃくちゃ時間かかってしまったけど、無事に目的達成。
この記事が気に入ったらサポートをしてみませんか?