• 締切済み

グループ中で最大値を含む行を抽出するSQLはどう書けば良いでしょうか

列A,Bでグループ化し、グループ中で列Cが最大値の列を取得したいのです。 数百万件あるので極力低コストにしたく、 副問合せはINDEXが効かないと聞いたのですが、 それ以外思いつきませんでした。 副問合せしない方法はないでしょうか? また、副問合せの中でコストの低いSQLはどんなものでしょうか。 ■テーブルです 名前 型 CUST_ID CHAR(8) BRANCH_ID CHAR(4) VALID_DATE DATE MYDATA VARCHAR2(20) CUST_ID BRAN VALID_DA MYDATA 19740704 0000 06-01-01 comment0001 19740704 0000 05-12-01 comment0000 19740704 0000 06-02-01 comment0002 19740704 0001 06-01-01 comment0011 19740704 0001 06-03-01 comment0012 ■このような結果が欲しいのですが。。。 CUST_ID BRAN VALID_DA MYDATA 19740704 0000 06-02-01 comment0002 19740704 0001 06-03-01 comment0012 ■考えたSQLです(検証済) select a.cust_id,a.branch_id,a.valid_date,a.mydata from test a,(select cust_id,branch_id,max(valid_date) as mvd from test group by cust_id,branch_id) b where a.cust_id=b.cust_id and a.branch_id=b.branch_id and a.valid_date=b.mvd ; select a.cust_id,a.branch_id,a.valid_date,a.mydata from test a where not exists (select * from test b where a.cust_id=b.cust_id and a.branch_id < b.branch_id) ; select cust_id,branch_id,valid_date,mydata from test where (cust_id,branch_id,valid_date) in (select cust_id,branch_id,max(valid_date) from test group by cust_id,branch_id) ; select cust_id,branch_id,valid_date,mydata from (select cust_id,branch_id,valid_date,mydata,max(valid_date) over(partition by cust_id,branch_id) as mvd from test) where valid_date=mvd ;

みんなの回答

  • 7colors
  • ベストアンサー率25% (29/114)
回答No.2

SELECT A.CUST_ID,A.BRANCH_ID,A.VALID_DATE,A.MYDATA FROM TABLE A WHERE A.VALID_DATE = ( SELECT MAX(B.VALID_DATE) FROM TABLE B WHERE B.CUST_ID = A.CUST_ID AND B.BRANCH_ID = A.BRANCH_ID) これで最新の一覧って取れませんか?

noname#44506
質問者

お礼

ありがとうございます! 頂いたSQL含めて一度コストを計測してみます。 少し時間がかかりそうですが、 結果は報告いたします。

noname#44506
質問者

補足

No1の方にご連絡した通り、結局他の方法で解決することになり、コスト計算も実施しませんでした。ご連絡遅くなって申し訳ありませんが、ありがとうございました。

回答No.1

>副問合せしない方法はないでしょうか? 副問い合わせを使うから、必ずしも非効率なSQLであるとは 言い切れませんよ? >副問合せの中でコストの低いSQLはどんなものでしょうか。 オプティマイザに聞かないと判りません。 素直に実行計画を出して、比較して下さい。 索引の有無やデータの分布など、いろいろな要素が絡み合って、 SQLの効率が変わります。 それらの情報無くして、効率的なSQLを選択するのは不可能です。

noname#44506
質問者

お礼

おっしゃる通りです。。。 上で頂いたSQL含めて一度実測してみます。

noname#44506
質問者

補足

ご回答ありがとうございました。 遅くなってしまって申し訳ございません。不要なレコードを除去して結果を得ることが目的だったのですが、結局は夜間のバッチ処理によって不要なレコードをメンテナンスすることになりました。コスト算出には本番環境で作業する必要があったのですが、不要であるということで結局作業しませんでした。

関連するQ&A