Amazon redshift 在红移中将表格数据转换为JSON

Amazon redshift 在红移中将表格数据转换为JSON,amazon-redshift,Amazon Redshift,我无法理解如何将表格数据转换为JSON格式并以红移格式存储在另一个表中。例如,我有一个带有四列的“DEMO”表:pid、stid、item\u id、trans\u id 对于pid、stid、item\u id的每个组合,都存在许多trans\u ids pid stid item_id trans_id : 1 , AB , P1 , T1 1 , AB , P1 , T2 1 , AB , P1 , T3 1 , AB , P1 , T4 2 , A

我无法理解如何将表格数据转换为JSON格式并以红移格式存储在另一个表中。例如,我有一个带有四列的
“DEMO”
表:
pid、stid、item\u id、trans\u id

对于
pid、stid、item\u id
的每个组合,都存在许多
trans\u 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"}

我无法理解如何使用红移中的SQL查询,仅为列
“trans\u id”
以JSON格式将数据从
“DEMO”
加载到
“SAMPLE”
。我不想使用任何中间文件。

有一个
listag
aggregate函数,允许您在组内连接文本值。它允许有效构造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
key:

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;

与现有答案非常相似,但略有不同。此示例还将在Oracle数据库中运行。我把工作投入其中,并想与他人分享,以防对他人有所帮助

/* Oracle Example */
WITH demo_data AS
(
  SELECT 1 AS pid, 'AB' AS stid, 'P1' AS item_id, 'T1' AS trans_id FROM dual UNION ALL
  SELECT 1 AS pid, 'AB' AS stid, 'P1' AS item_id, 'T2' AS trans_id FROM dual UNION ALL
  SELECT 1 AS pid, 'AB' AS stid, 'P1' AS item_id, 'T3' AS trans_id FROM dual UNION ALL
  SELECT 1 AS pid, 'AB' AS stid, 'P1' AS item_id, 'T4' AS trans_id FROM dual UNION ALL
  SELECT 2 AS pid, 'ABC' AS stid, 'P2' AS item_id, 'T5' AS trans_id FROM dual UNION ALL
  SELECT 2 AS pid, 'ABC' AS stid, 'P2' AS item_id, 'T6' AS trans_id FROM dual UNION ALL
  SELECT 2 AS pid, 'ABC' AS stid, 'P2' AS item_id, 'T7' AS trans_id FROM dual UNION ALL
  SELECT 2 AS pid, 'ABC' AS stid, 'P2' AS item_id, 'T8' AS trans_id FROM dual
)
, transformData AS
(
SELECT pid, stid, item_id, trans_id, rownum AS keyNum FROM demo_data
)

SELECT pid, stid, item_id
  , '{'||
    LISTAGG(CHR(34)||'key'||keynum||CHR(34)||':'||CHR(34)||trans_id||CHR(34), ' ')
    WITHIN GROUP (ORDER BY pid)
    ||'}' AS trans_id

FROM transformData
GROUP BY pid, stid, item_id
;
输出将如下所示: