- ベストアンサー
レコードの選択の仕方
sqlのチューニングが得意なOracle Master所有者です。 ちょっとわからないことがあるので教えてください。 KEY1, KEY2でソートし、 ・先頭レコード ・最終レコード ・項目A1~A100の値が変わったレコード を出力したいのですが、どうすればよいでしょうか? レコード数は約7万で、「SQLで」驚速で処理したいです。 中間テーブルを使用して、特別なインデクスや編集を使用する例でも構いません。 例)★が出力するレコード KEY1 KEY2 A1 A2 A3 ... A100 A 1 0 1 0 0 ★ A 2 0 1 0 0 A 3 0 2 0 0 ★ A 4 0 2 0 0 A 5 0 1 0 0 ★ A 6 0 2 0 0 ★ ... A 60 0 2 5 0 ★ B 1 0 1 0 0 ★ B 2 0 1 0 0 B 3 0 0 0 0 ★ B 4 0 0 1 0 ★ B 5 0 0 1 0 ... B 70 0 2 5 0 ★ C 略
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
激速を要求してトリッキーな手法も含むのであれば 厳密なバージョン、エディション、更新頻度、テーブル定義を 載せるのが良いです。 従属項目の属性、値域、カーディナリティはかなり重要ですから そちらも提示した方がなお良しです。 チューニングが得意と前置きして激速と回答者に高い敷居を設けるのであれば まずは、自分の書いたボーダーとなるSQLを明示することが必要でしょう。 あと自分ならば、 このようなマニアックな質問するのに 穴場的存在と思えるこの場を選ばないだろうな~と思います。
その他の回答 (1)
- kazu1213
- ベストアンサー率60% (3/5)
PL/SQLによるテキストファイル出力例(/tmp/test.txt)です。 ※ 項目間は半角スペース declare ftype utl_file.file_type; chead varchar2(1000) := 'key1 key2'; data_old varchar2(1000) := ' '; ncount integer; n integer := 1; cursor c1 is select key1,key2, A1 || ' ' || A2 || ' ' || ‥‥ || ' ' || A100 data from tbl order by key1,key2; begin ftype := utl_file.fopen('/tmp','test.txt','w'); for i in 1..100 loop chead := chead || ' A' || to_char(i,'FM999'); end loop; utl_file.putf(ftype,chead || '\n'); select count(*) into ncount from tbl; for c1_rec in c1 loop if c1_rec.data != data_old or n = ncount then /* 先頭レコード or 変更レコード or 最終レコード? */ utl_file.putf(ftype,c1_rec.key1 || ' ' || c1_rec.key2 || c1_rec.data || '\n'); end if; data_old := c1_rec.data; n := n + 1; end loop; utl_file.fclose(ftype); end; /
補足
ふむむ。 結局、ナンバーを row_number()で付与し、ナンバーが1番違うのを比較することにしました。