dポイントプレゼントキャンペーン実施中!

いつもお世話になります。
GROUP BY , MAX の使用法に関して質問です。
USERCDとKYOUTUNOでグルーピングをしてSEQの最大値のレコードを抽出しようとしています。
以下のようなSQL文の場合ですとBIKOUがないレコードを抽出する事が出来るかと思います。
【select USERCD , KYOUTUNO , MAX(SEQ) from テーブル1 group by USERCD , KYOUTUNO】

そこで、BIKOU も同時に抽出したいのですが、BIKOUを選択列に入れると「GROUP BYの式ではありません。」のエラーが出ます。

「そりゃそうだ」だと思うのですが、どうのようにすればSQL文を作れば結果のようなレコードを抽出出来るのでしょうか?

よろしくお願いします。

◆テーブル1のデータ
USERCD KYOUTUNO SEQ BIKOU
-------------------------------------
100 100 1 あああああ
100 100 2 いいいいい
100 100 3 あいうえお
222 200 1 AAAAA
222 200 2 AAAAAA
3333 100 1 うううううう
44444 100 1 ううううう
44444 100 2 えええ

◆結果
USERCD KYOUTUNO SEQ BIKOU
-------------------------------------
100 100 3 あいうえお
222 200 2 AAAAAA
3333 100 1 うううううう
44444 100 2 えええ

■ORACLEのバージョン
 Oracle9i

A 回答 (3件)

9iスタンダード以降なら、探査回数が一回で済むよう分析関数を使った方が効率的な気がします。


select USERID,KYOUTUNO,SEQ,BIKOU
from
(
select x.*,row_number() over(partition by USERID,KYOUTUNO order by SEQ desc) R
from TABLE x
)
where R=1;

分析関数が使えないバージョン・エディションなら、
select * from TABLE
where
(USERID,KYOUTUNO,SEQ)
in
(select USERID,KYOUTUNO,max(SEQ) from TABLE);
のようなサブクエリを使った解決策になります。
    • good
    • 0
この回答へのお礼

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

分析関数。。。

今まで目をつむってきました。これを機に勉強したいと思います。

お礼日時:2009/04/20 20:06

not exists を使って


select * from tbla a1
where not exists
( select 1 from tbla a2
where a1.usercd = a2.usercd
and a1.kyoutuno = a2.kyoutuno
and a1.seq < a2.seq );
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。
existsにこんな使用方法があったなんて、まだまだ勉強や経験が必要だなぁと思いました。

お礼日時:2009/04/20 20:05

↓でどうでしょうか?試してないのでちゃんと動くかわかりませんが・・・。




select *
from テーブル1 t1
where
t1.SEQ = (
select max(t2.SEQ)
from テーブル1 t2
where
t2.USERCD = t1.USERCD and
t2.KYOUTUNO = t1.KYOUTUNO
)
    • good
    • 0
この回答へのお礼

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

ばっちり動きました。

お礼日時:2009/04/20 20:02

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

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