列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 ;
No.1ベストアンサー
- 回答日時:
>副問合せしない方法はないでしょうか?
副問い合わせを使うから、必ずしも非効率なSQLであるとは
言い切れませんよ?
>副問合せの中でコストの低いSQLはどんなものでしょうか。
オプティマイザに聞かないと判りません。
素直に実行計画を出して、比較して下さい。
索引の有無やデータの分布など、いろいろな要素が絡み合って、
SQLの効率が変わります。
それらの情報無くして、効率的なSQLを選択するのは不可能です。
この回答への補足
ご回答ありがとうございました。
遅くなってしまって申し訳ございません。不要なレコードを除去して結果を得ることが目的だったのですが、結局は夜間のバッチ処理によって不要なレコードをメンテナンスすることになりました。コスト算出には本番環境で作業する必要があったのですが、不要であるということで結局作業しませんでした。
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)
これで最新の一覧って取れませんか?
この回答への補足
No1の方にご連絡した通り、結局他の方法で解決することになり、コスト計算も実施しませんでした。ご連絡遅くなって申し訳ありませんが、ありがとうございました。
補足日時:2006/05/28 19:21お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで最後の文字だけ置き...
-
エクセルの関数について教えて...
-
”photo id” とは何ぞや?
-
SQLサーバから、項目の属性(型...
-
マイクラPC版のコマンドで効率...
-
sqlで、600行あるテーブルを100...
-
SQLの検索について
-
ファミマTカード会員番号
-
阪急三番街 ATM(ゆうちょ)は...
-
Access パラメータクエリをcsv...
-
inner joinをすると数がおかし...
-
カンマ区切りの文字列を検索する
-
#1136 - Column count doesn't ...
-
tinyint(1) についての質問です。
-
LEFT JOIN とRIGHT JOINの合体...
-
フィールド名を変数で指定するには
-
SQL Left Join で重複を排除す...
-
Yahoo .comの idには年齢制限、...
-
上位3位を求めるSQL文は?
-
副問合せの書き方について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで最後の文字だけ置き...
-
エクセルの関数について教えて...
-
VIEWの元のテーブルのindexって...
-
副問合せの書き方について
-
select文のwhere句に配列を入れ...
-
マイクラPC版のコマンドで効率...
-
SQLサーバから、項目の属性(型...
-
エラー 1068 (42000): 複数の主...
-
[MySQL] 3つのテーブルの結合で...
-
Access パラメータクエリをcsv...
-
SQLにて特定の文字を除いた検索...
-
SQL Left Join で重複を排除す...
-
ストアドのエラーについて
-
Unionした最後にGROUP BYを追加...
-
バインド変数について
-
PL/SQLの変数について
-
sqlで、600行あるテーブルを100...
-
WordpressのContact form 7でzi...
-
selectした大量データをinsert...
-
inner joinをすると数がおかし...
おすすめ情報