为此:
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
进行“分组”,因此相当困难,尽管这可能只是在逃避我的操作)答案 0 :(得分:1)
map_agg
与GROUP 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