- ベストアンサー
GROUP BYを使って書けますでしょうか?
以下のような為替レートのテーブル(kawase)があるとします。 ※値は適当です。 date | cur | rate 2008-08-30 | USD | 110.36 2008-09-05 | USD | 178.34 2008-09-25 | USD | 100.45 2008-10-05 | USD | 96.54 2008-08-13 | EUR | 180.10 2008-09-08 | EUR | 200.54 2008-09-09 | EUR | 200.42 2008-10-11 | EUR | 160.31 2008-08-20 | GBP | 170.00 2008-09-10 | GBP | 181.45 2008-09-18 | GBP | 192.33 2008-09-24 | GBP | 195.02 米ドル(USD)の最新情報を取得するには、 以下のSQLでよいと思います。 SELECT * FROM kawase WHERE cur = 'USD' ORDER BY date DESC LIMIT 1; では、以下のように、全ての通貨の「最新情報」を 取得するには、どうすればよいでしょうか? date | cur | rate 2008-10-05 | USD | 96.54 2008-10-11 | EUR | 160.31 2008-09-24 | GBP | 195.02 GROUP BYでできますでしょうか? ※UNIONを使えばできましたが、通貨の種類が多数あるので、 SQLの行数が増えてしまいました。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
not exists を使えば select * from kawase k where not exists ( select 1 from kawase k2 where k.cur=k2.cur and k.date<k2.date ) (cur,date)に索引があれば結構レスポンスはいいと思いますが。
その他の回答 (2)
- soramame99
- ベストアンサー率46% (12/26)
サブクエリを使えばこんな感じでしょうか? SELECT * FROM kawase WHERE (date,cur) IN (SELECT MAX(date),cur FROM kawase GROUP BY cur); ん~、まだ簡単な方法がある気もしますが。
お礼
ご回答ありがとうございました。 WHERE (A, B) IN (・・・) こんなことできるんですね!勉強になりました。 やはり、サブクエリが必要になりますかね? 実は、サブクエリ使ってるんですが、もっと簡単な方法ないですか? と聞かれて、GROUP BYでMAX(date)すればいいのでは? と答えたものの、できなかったので。。 スマートでパフォーマンスの高いSQLはどういったものになるでしょうか? パフォーマンスが高い理由が分ければ、サブクエリでもUNIONでも構いません。 なんか、すっごい単純なことをやろうとしているのに、 単純に出来なかったので、質問してみました。
- yambejp
- ベストアンサー率51% (3827/7415)
MySQLのバージョンは?? 基本的には日付のMAXをとると最新日になるでしょう その時のrateはサブクエリで得ることになるでしょうか。
補足
ご回答ありがとうございました。 バージョンは忘れました。。5.1以上だったと思います。 やはり、サブクエリが必要になりますかね? 実は、サブクエリ使ってるんですが、もっと簡単な方法ないですか? と聞かれて、GROUP BYでMAX(date)すればいいのでは? と答えたものの、できなかったので。。 スマートでパフォーマンスの高いSQLはどういったものになるでしょうか? パフォーマンスが高い理由が分ければ、サブクエリでもUNIONでも構いません。
お礼
ご回答ありがとうございます。 やはり、サブクエリーですね。了解しました。 existsほとんど使ったことないのですが、 この機会に勉強してみます。 ありがとうございました。