在 Redshift 中将表格数据转换为 JSON

kun*_*nds 3 amazon-redshift

我无法弄清楚如何将表格数据转换为 JSON 格式并将其存储在 Redshift 中的另一个表中。例如,我有一个"DEMO"包含四列的表:pid,stid,item_id,trans_id

对于每个组合都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
Run Code Online (Sandbox Code Playgroud)

我想将这些数据存储在另一个表中,称为"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"}
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚如何仅使用 Redshift 中的 SQL 查询从"DEMO"到以 JSON 格式加载数据。我不想使用任何中间文件。"SAMPLE""trans_id"

Ale*_*Yes 6

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;
Run Code Online (Sandbox Code Playgroud)

附带说明一下,在这种特殊情况下,交易 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;
Run Code Online (Sandbox Code Playgroud)