グループ中で最大値を含む行を抽出する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 ;