2017-07-08 70 views
1

我無法弄清楚如何將表格數據轉換爲JSON格式並將其存儲在Redshift的另一個表中。例如,我有一個"DEMO"表,有四列:pid,stid,item_id,trans_id在Redshift中將表格數據轉換爲JSON

對於pid,stid,item_id的每個組合,存在許多trans_id s。

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"爲:

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"} 

我無法弄清楚如何從"DEMO"使用的數據加載到JSON格式"SAMPLE"只爲"trans_id"列Redshift中的SQL查詢。我不想使用任何中間文件。

回答

0

LISTAGG聚合函數,允許您連接組內的文本值。它允許JSON的有效的施工對象:

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; 

作爲一個方面說明,在這種特殊情況下的交易ID數組可能更好地工作,你就可以請求特定順序的元素很容易,而無需使用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;