需要使用 trino SQL 获取 array(row(tid array(varchar), res varchar)) 格式的结果

问题描述 投票:0回答:1

我有一个表 - NS_Data

ns tid 资源 尼德
PQR ITKT20254 不包括 A
PQR ITKT20223 不包括 A
PQR ABCD23456 不包括 B
PQR ABCD54321 不包括 B
PQR ITKT21111 包括 A

我想要以下格式的输出

ns 尼德 最终地图
PQR A [{tid=[ITKT20254, ITKT20223],res=不包含}, {tid=[ITKT21111],res=包含}]
PQR B [{tid=[ABCD23456, ABCD54321], res=不包括}]

我想要finalMap的类型 数组(行(tid 数组(varchar),res varchar))。我用 json 得到了结果,但与预期的 array(row(tid array(varchar), res varchar)) 格式不兼容。

sql aggregate-functions presto trino
1个回答
0
投票

如果结果行类型中的列顺序并不重要,那么您可以使用

multimap_agg
并在其后使用
map_entries
进行一些转换:

-- sample data
WITH dataset(ns, tid, res, nid) AS
(
    values ('PQR',  'ITKT20254',    'not include',  'A'),
    ('PQR', 'ITKT20223',    'not include',  'A'),
    ('PQR', 'ABCD23456',    'not include',  'B'),
    ('PQR', 'ABCD54321',    'not include',  'B'),
    ('PQR', 'ITKT21111',    'include',  'A')
)

-- query
select ns, nid, 
    cast(map_entries(multimap_agg(res, tid)) as array(row(res varchar, tid array(varchar)))) 
       as finalMap
from dataset
group by ns, nid;

输出:

ns 尼德 最终地图
PQR A [{res=不包括,tid=[ITKT20254,ITKT20223]},{res=包括,tid=[ITKT21111]}]
PQR B [{res=不包括, tid=[ABCD23456, ABCD54321]}]

如果顺序是固定的,那么您将需要添加额外的步骤来重新排序行中的列。

© www.soinside.com 2019 - 2024. All rights reserved.