プロが教えるわが家の防犯対策術!

下記のようなテーブルがあった場合に、

ID1|ID2|価格
-----------------------
1 | 1 | 100
1 | 2 | 200
1 | 3 | 150
2 | 1 | 1000
2 | 2 | 500
3 | 1 | 50
3 | 2 | 100

下記のようなレコードを返してくるSQLを教えて下さい。
ID1 | ID2 | 価格
-----------------------
1 | 3 | 150
2 | 2 | 500
3 | 2 | 100

要するに、ID1毎に、ID2が最大のレコードを取得し、価格列の数値を使いたいのです。
基本的なSQLは理解しているつもりなのですが・・・。

ご回答よろしくお願いします。

A 回答 (2件)

SQL> select * from test;



   ID1    ID2   XXX
---------- ---------- ----------
    1     1    100
    1     2    200
    1     3    150
    2     1    1000
    2     2    500
    3     1     50
    3     2    100

7行が選択されました。

SQL> select ID1
 2    ,max(ID2) as ID2
 3    ,max(XXX)keep(dense_rank Last order by ID2) as XXX
 4  from test
 5  group by ID1;

    ID1    ID2    XXX
---------- ---------- ----------
     1     3     150
     2     2     500
     3     2     100

SQL>
    • good
    • 6

select * from tbl t1


where not exists
( select 1 from tbl t2
where t1.id1=t2.id1
and t1.id2<t2.id2)
とか
select * from tbl t1
where id2 >= all(select id2 from tbl t2 where t1.id1=t2.id1)
とか
    • good
    • 0
この回答へのお礼

やっぱりexists使わないとだめっすかねー
パフォーマンス的にだいぶ劣るような気がした&慣れてない ので、できれば回避したかったんですが。
諦めて、ご提案のSQLを使う方向でじっくりとやってみます。

お礼日時:2009/06/29 09:51

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

このQ&Aを見た人はこんなQ&Aも見ています

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