アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

A 回答 (2件)

>副問合せしない方法はないでしょうか?



副問い合わせを使うから、必ずしも非効率なSQLであるとは
言い切れませんよ?

>副問合せの中でコストの低いSQLはどんなものでしょうか。

オプティマイザに聞かないと判りません。
素直に実行計画を出して、比較して下さい。

索引の有無やデータの分布など、いろいろな要素が絡み合って、
SQLの効率が変わります。
それらの情報無くして、効率的なSQLを選択するのは不可能です。

この回答への補足

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

補足日時:2006/05/28 19:21
    • good
    • 1
この回答へのお礼

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

お礼日時:2006/01/13 00:51

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)
これで最新の一覧って取れませんか?

この回答への補足

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

補足日時:2006/05/28 19:21
    • good
    • 2
この回答へのお礼

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

お礼日時:2006/01/13 00:50

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