実際には、これらのフィールドは「1」ではなく長い長い文字列です。私のここでの目標は、このデータを階層オブジェクトに解析するC++プログラムを持つことです。クエリをできるだけ早く実行し、オブジェクトの埋め込みに使用できる最小限のデータ量を返します。「前回の印刷行から値が変更された場合にのみ印刷します」
私の想像力では、この目標はどのように達成できるのでしょうか?本当の目標を達成するための簡単な方法があれば、私はすべて耳にします。
私が考えたもの: ピボットテーブルと考えましたが、階層の各階層に5つのブランチがある場合は、データを取得するまでにピボットテーブルに3000以上の列があります。
私は、彼らが以前に印刷された行と同じ ない場合は階層ヘッダフィールド、およびのみ印刷フィールドによってグルーピング全てながら、次にそれらLISTAGG、一緒に2つのフィールドを連結します。
input
tier1,tier2,tier3,tier4,tier5,data1,data2
1 1 1 1 1 big tall
1 1 1 1 1 big smelly
1 1 1 1 2 gross tall
1 1 1 2 1 flatulent exceptional
desired output:
1 1 1 1 1 big,tall big,smelly
2 gross,tall
2 1 flatulent,exceptional
だけそれが最後に印刷行以降に変更された場合、我々は(クレイジーそれを呼び出すフィールドを出力する仮想関数に)
select
crazy(tier1),
crazy(tier2),
crazy(tier3),
crazy(tier4),
crazy(tier5),
listagg(data1||data2, ' ') within group(?)
from table
group by tier1,tier2,tier3,tier4,tier5