泣きながら食べたご飯の思い出

以下のような為替レートのテーブル(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の行数が増えてしまいました。

A 回答 (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)に索引があれば結構レスポンスはいいと思いますが。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

やはり、サブクエリーですね。了解しました。
existsほとんど使ったことないのですが、
この機会に勉強してみます。

ありがとうございました。

お礼日時:2008/09/27 02:46

サブクエリを使えばこんな感じでしょうか?


SELECT * FROM kawase WHERE (date,cur) IN (SELECT MAX(date),cur FROM kawase GROUP BY cur);
ん~、まだ簡単な方法がある気もしますが。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。

WHERE (A, B) IN (・・・)
こんなことできるんですね!勉強になりました。

やはり、サブクエリが必要になりますかね?
実は、サブクエリ使ってるんですが、もっと簡単な方法ないですか?
と聞かれて、GROUP BYでMAX(date)すればいいのでは?
と答えたものの、できなかったので。。

スマートでパフォーマンスの高いSQLはどういったものになるでしょうか?
パフォーマンスが高い理由が分ければ、サブクエリでもUNIONでも構いません。

なんか、すっごい単純なことをやろうとしているのに、
単純に出来なかったので、質問してみました。

お礼日時:2008/09/23 12:50

MySQLのバージョンは??



基本的には日付のMAXをとると最新日になるでしょう
その時のrateはサブクエリで得ることになるでしょうか。

この回答への補足

ご回答ありがとうございました。

バージョンは忘れました。。5.1以上だったと思います。

やはり、サブクエリが必要になりますかね?
実は、サブクエリ使ってるんですが、もっと簡単な方法ないですか?
と聞かれて、GROUP BYでMAX(date)すればいいのでは?
と答えたものの、できなかったので。。

スマートでパフォーマンスの高いSQLはどういったものになるでしょうか?
パフォーマンスが高い理由が分ければ、サブクエリでもUNIONでも構いません。

補足日時:2008/09/23 12:44
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す