2012-03-07 6 views
0

実際には、これらのフィールドは「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 

答えて

0

あなたが列を知っている場合は、潜在的に使用することができますCTE(使用しているSQLのバージョンによって異なります)。それがうまくいかない場合は、コード内で作業することをお勧めします。 SQLは、SETベースのロジックであり、プロシージャや関数ではありません(サポートされていても)。すべての行で5または6つの関数を実行すると、コード内で分析を実行する場合と比較して、恐ろしい結果になります

関連する問題