見出し画像

【Java】MySQLで月毎の最新データをリストとして取得したい

こんなテーブルから、月毎の最新データのみをリスト化したい。

スクリーンショット 2019-10-13 18.44.21


これを月毎にグループ化できたはいいけど、その各月の最新日時の金額を取得できない。

このやり方だと、月毎の集計金額や最小、最大の金額は取得できるけど、最新日時に紐づいた金額が取得できない。

GROUP BY に指定していないフィールドを集計関数を通さずに取得することはできないので、sum(price)をpriceにしてもエラーになる。priceと指示されてもMySQLはその月グループにはいくつかpriceがあって、どのpriceを指しているかわからないため。

スクリーンショット 2019-10-13 14.12.13

ちなみに最後に「WITH ROLLUP」をつければ全期間の集計が行える。

スクリーンショット 2019-10-13 14.11.34


気を取り直して同じグループ内で、あるフィールド(作成日)が最大のレコードを取得したい。


別のやり方を試してみる。
こうすることで、テーブル内の全てのデータから最新の情報を取得できた。
しかし全データの最新ではなく各月毎の最新を取得したいのでダメ。。。

スクリーンショット 2019-10-13 14.19.37


各年月のグループ化と、各年月ごとの最新日時が取得できた。この最新日時に紐づくpriceカラムが取得できればOKなのだが、SELECTにpriceを含めてもエラーになってしまう。。

スクリーンショット 2019-10-13 14.47.24


また考え方を変えて...
全データを一旦取得して、同じ年月でのランキング番号をNewRankカラムに取得。このNewRankが1のレコードだけ取得できれば実現できる!

スクリーンショット 2019-10-13 18.28.38

こうすることで各月の無事ランキング一位だけを取得!

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​

スクリーンショット 2019-10-13 19.01.02


むちゃくちゃ時間かかってしまったけど、無事に目的達成。

この記事が気に入ったらサポートをしてみませんか?