在Presto中将两列转换为键值对JSON字符串

时间:2018-06-28 05:15:49

标签: sql presto

为此:

XXX YYY ZZZ
--- --- ---
AAA PPP LLL
AAA QQQ MMM
AAA RRR NNN

如何将其转换为此?

XXX JSON
--- ----
AAA {"PPP": "LLL", "QQQ": "MMM", "RRR": "NNN"}

仅供参考,我无权访问数据库中的row_to_json函数。尝试包括:

  • 将它们串联为字符串(由于需要XXX进行“分组”,因此相当困难,尽管这可能只是在逃避我的操作)
  • 旋转表,然后尝试将它们串联为字符串(在我想要的运行时中,大约1亿行非常困难且性能不佳)

2 个答案:

答案 0 :(得分:1)

map_aggGROUP BY结合在一起就是您要寻找的东西。

示例

presto:default> SELECT * FROM t;
 id  | key | value
-----+-----+-------
 AAA | QQQ | MMM
 AAA | PPP | LLL
(2 rows)

presto:default> SELECT id, CAST(map_agg(key, value) AS json) FROM t GROUP BY id;
 id  |           _col1
-----+---------------------------
 AAA | {"PPP":"LLL","QQQ":"MMM"}
(1 row)

答案 1 :(得分:-1)

我没有要测试的prestodb,但是也许这个答案使您轻而易举地做到了。 我也不知道RECURSIVE CTE是否可用。有时不支持单词 RECURSIVE ,但可以递归。您必须测试这个自我。 在PostgreSQL http://sqlfiddle.com/#!17/07576/4/0上进行了测试。

WITH RECURSIVE CTE AS
(
    SELECT 
        T.XXX, T.YYY, T.ZZZ,  '"' || T.YYY || '": "' || T.ZZZ || '"' AS JSON
    FROM
        T5 T

    UNION ALL

    SELECT
        T.XXX, T.YYY, T.ZZZ, C.JSON || ', ' || '"' || T.YYY || '": "' || T.ZZZ || '"' AS JSON
    FROM
        T5 T
        INNER JOIN CTE C ON C.XXX=T.XXX AND C.YYY || '_' || C.ZZZ>T.YYY || '_' || T.ZZZ
)

SELECT 
    C.XXX,  '{' || MAX(C.JSON) || '}' AS JSON
FROM 
    CTE C
GROUP BY C.XXX