• ベストアンサー

GROUP BY , MAX の使用法に関して

いつもお世話になります。 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

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

  • ベストアンサー
回答No.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); のようなサブクエリを使った解決策になります。

tyome2
質問者

お礼

ご回答ありがとうございます。 分析関数。。。 今まで目をつむってきました。これを機に勉強したいと思います。

その他の回答 (2)

  • nora1962
  • ベストアンサー率60% (431/717)
回答No.2

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 );

tyome2
質問者

お礼

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

  • cyanberry
  • ベストアンサー率50% (117/230)
回答No.1

↓でどうでしょうか?試してないのでちゃんと動くかわかりませんが・・・。 select * from テーブル1 t1 where t1.SEQ = ( select max(t2.SEQ) from テーブル1 t2 where t2.USERCD = t1.USERCD and t2.KYOUTUNO = t1.KYOUTUNO )

tyome2
質問者

お礼

ご回答ありがとうございます。 ばっちり動きました。

関連するQ&A