• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:MySQLで対象期間を決め集計しランキングする方法)

MySQLで対象期間を決め集計しランキングする方法

このQ&Aのポイント
  • MySQLの初心者でも、対象期間を指定してデータを集計し、ランキング付けして任意の上位を抽出する方法を教えてください。
  • 単純に上位5位を抽出する場合は、order by `金額` Limit 5を使用すれば良いです。しかし、同順の場合はどうすれば良いかわかりません。
  • 一つの解決策として、指定期間の集計結果のビューを作成し、そのビューからランキングを計算する方法がありますが、手間がかかります。

質問者が選んだベストアンサー

  • ベストアンサー
  • mpro-gram
  • ベストアンサー率74% (170/228)
回答No.1

mysql 限定なら 変数を使って期間用データを指定すればいいのでは? 先にsetクエリで変数に値を代入しておけば、select句の相関クエリにも使えるだろう。 set @d1="20170101" d1, @d2="20170331"; select `品名`, kei ,(select count(*) +1 from (select `品名`,sum(`金額`) as kei from uriage where `日付` BETWEEN @d1 AND @d2 group by `品名`) x2 where x1.kei<x2.kei ) rank from (select `品名`,sum(`金額`) as kei from uriage where `日付` BETWEEN @d1 AND @d2 group by `品名`) x1 having rank<=5 order by rank; アプリケーションから発行するのであれば、日付変数名のところをプレースホルダーにしてpreparedすれば、プレースホルダーが2カ所だろうが4カ所だろうが、置き換え順を間違わなければ、2番目のselect文一つで済む。

turu575
質問者

お礼

補足とお礼欄間違えました。ここでもバカやっている。慣れないと駄目だ・・・ 本当に有難うございました。

turu575
質問者

補足

有難うございました。 set @d1="20170101" d1, @d2="20170331"; select `品名`, kei ,(select count(*) +1 from   でOKでした。この回答で自分が馬鹿やっていたの痛感しました。両方に期間設定するのを忘れて片側だけで試していてこんな馬鹿な質問をしました。現在試しいるは、通常使っているDBのfilemakerからODBC接続でSQLを実行することでその結果をfilemakerのインポートで取得するスクリプトを組むことです。100万件以上のレコードでは、filemakerのExecuteSQLのRANK関数ではとんでもない処理時間がかかるのでレコードをmysql側におき期間設定をfilemakerで設定しSQL文に自動的に組み込ませSQLの実行でmysqlで計算させその結果をインポートするものです。1行1レコードの問題はありますがここで関係ないので問題なし・・・こんな方法ですのでfilemakerで set @d1="20170101" d1, @d2="20170331"; select `品名`, kei ,(select count(*) +1 from は記述しても動かないので(select以降で変数定義する場合は別です・・・確か他の例では)setを使わず直接両方に期間設定する方法でOKでした。但しパフォーマンスは、ビューを使ったものと同じでしたが・・・ 当方の馬鹿で未熟な質問にお答えいただき有難うございました

関連するQ&A