在 PrestoSQL 中将行组合成一个列表
Posted
技术标签:
【中文标题】在 PrestoSQL 中将行组合成一个列表【英文标题】:Combine rows into a list in PrestoSQL 【发布时间】:2019-08-17 14:34:49 【问题描述】:目前,我的表有三个不同的字段,id1
、id2
和 actions
。 action
是字符串类型。例如,我的表格类似于下面给出的表格:
id1 | id2 | actions
---------------------------
"a1" "a2" "action1"
"b1" "b2" "action2"
"a1" "a2" "action3"
如果id1
的值和id2
的值对于任意数量的行都相同,我想组合这些行,以便actions
字段成为字符串列表。如果没有任何行具有相同的 id1
值和相同的 id2
值,我仍想将 actions
字段转换为列表,但只有一个字符串。例如,查询的输出应如下所示:
id1 | id2 | actions
---------------------------
"a1" "a2" ["action1", "action3"]
"b1" "b2" ["action2"]
我了解 Presto 的一些基础知识,并且可以根据条件连接列,但不确定这是否可以通过查询来实现。如果这可以实现,那么推进这个逻辑的实施的好方法是什么?
【问题讨论】:
【参考方案1】:尝试将ARRAY_JOIN
与ARRAY_AGG
一起使用:
SELECT
id1,
id2,
ARRAY_JOIN(ARRAY_AGG(actions), ',') actions
FROM yourTable
GROUP BY
id1,
id2;
【讨论】:
ARRAY_JOIN(ARRAY_AGG(
这会改变顺序。你知道怎么解决吗?,在这个问题中,我想保持订单,所以联系人应该是action1,action2
但很多时候我得到了像action2,action1
这样的错误订单
如果您想保留订单请参考array_agg(x ORDER BY y DESC)
@Vision 是真正的金色,非常感谢!【参考方案2】:
如果你想将结果作为一个数组,你可以使用 flatten 代替 array_join:
select
id1, id2, flatten(array_agg(actions)) as actions
from table
group by id1, id2
【讨论】:
以上是关于在 PrestoSQL 中将行组合成一个列表的主要内容,如果未能解决你的问题,请参考以下文章
基于其他列(即应用 CDC)将多个 spark 数据帧行组合成一个
如何编辑这个 mySQL 以便将相同 id 的行组合成 1 而不是 3?