1

53 列と 100 万行程度のテーブル x があります。最初の列は識別子で、次の 52 列は特定の日付から毎週発生する金融取引です。

例えば。

id,w1,w2,w3,w4,w5..w52
a1,0,5,1,4,0..43
a2,7,0,6,9,4..27

IDごとに、これらすべての週のトランザクションの累積合計が必要です。私が見つけた 1 つの解決策は、unpivot を使用して ID ごとに 52 行を取得してから、集計合計を適用することでした。

sum(transaction) over (partition by id order by week asc)

ここでの問題は、現在 6,000 万行のテーブルがあり、Oracle が合計を取得するまでの並べ替えを非常に遅く実行していることです。

別のオプションは、次のように各列を手動で追加することです。

select 
 id,
 w1,
 w1+w2,
 w1+w2+w3,
 w1+w2+w3+w4,
 w1+w2+w3+w4+w5,
 ..
 w1+w2+w3+w4+w5..w49+w50+w51+w52

from x

ここでの問題は、単純な数式を取得するのに大量のコードが必要になることです (コードを書き出すのは大変です!)。

テーブル (インデックス/パーティション) を調整して、非常に多くの行の集計合計を高速化できるものはありますか、または元のテーブルで使用して最小限の労力でこれらの結果を達成できるコードはありますか?!

4

1 に答える 1

1

「大量のコード」を非表示にするビューを作成します。例えば:

SQL> desc tester;
 Name                                      Null?    Type
 ----------------------------------------- -------- ---------------
 ID                                                 NUMBER
 W1                                                 NUMBER
 W2                                                 NUMBER
...
 W49                                                NUMBER
 W50                                                NUMBER
 W51                                                NUMBER
 W52                                                NUMBER

次に、次のような SQL を実行します (11glistaggでは、代わりにwm_concat同じ効果を得るために使用できます)。

select 'create or replace view v_tester as select id ' from dual
union all
select * 
  from (select ','||replace(wm_concat(column_name) over (order by column_id), ',', '+') || ' as col' || rownum
  from user_tab_columns
 where table_name = 'TESTER'
   and column_id >= 2
 order by column_id)
union all
select ' from tester;' from dual;

次のような DDL を生成します。

create or replace view v_tester as select id 
,W1 as col1
,W1+W2 as col2
,W1+W2+W3 as col3
,W1+W2+W3+W4 as col4
,W1+W2+W3+W4+W5 as col5

など..それを実行します。これで、コードはビューによって隠され、比較的簡単に作成できるようになりました。

于 2013-03-25T15:30:47.430 に答える