2017-07-08 25 views
1

表形式のデータをJSON形式に変換し、それをRedshiftの別の表に保存する方法がわかりません。たとえば、という4つの列を持つ表があります。pid,stid,item_id,trans_idレッドシフトの表形式データからJSONへの変換

pid,stid,item_idの各組み合わせに対して、多くはtrans_idsが存在します。

pid stid item_id trans_id : 

1 , AB , P1 , T1 
1 , AB , P1 , T2 
1 , AB , P1 , T3  
1 , AB , P1 , T4 
2 , ABC , P2 , T5 
2 , ABC , P2 , T6 
2 , ABC , P2 , T7 
2 , ABC , P2 , T8 

私は別のテーブルにこのデータを保存するには、呼び出され"SAMPLE"として:私は使用してのみ、列"trans_id"ためにJSON形式で"SAMPLE""DEMO"からデータをロードする方法を見つけ出すことができません

pid stid item_id  trans_id 

1 , AB , P1 , {"key1":T1, "key2":"T2" "key2":"T3" "key2":"T4"}  
2 , ABC , P2 , {"key1":T5, "key2":"T6" "key2":"T7" "key2":"T8"} 

RedshiftのSQLクエリ。私は中間ファイルを使用したくない。

答えて

0

LISTAGG集約関数を使用すると、グループ内のテキスト値を連結することができます。トランザクションIDの配列が良く働くかもしれない、この特定のケースでは、あなたが使用しなくても簡単に特定の順序の要素を要求することができるでしょう、注意点として

SELECT 
pid 
,stid 
,item_id 
,'{'||listagg(
    '"key'||row_number::varchar||'":'||trans_id::varchar 
    ,',') within group (order by row_number) 
||'}' 
FROM (
    SELECT *, row_number() over (partition by pid,stid,item_id order by trans_id) 
    FROM "DEMO" 
) 
GROUP BY 1,2,3; 

:それはJSONオブジェクトを効果的に構築することができますkeyNキー:

WITH tran_arrays as (
    SELECT 
    pid 
    ,stid 
    ,item_id 
    ,listagg(trans_id::varchar,',') within group (order by trans_id) as tran_array 
    FROM "DEMO" 
    GROUP BY 1,2,3 
) 
SELECT * 
,split_part(tran_array,',',1) as first_element 
FROM tran_arrays; 
関連する問題