在 PrestoSQL 中将行组合成一个列表

Posted

技术标签:

【中文标题】在 PrestoSQL 中将行组合成一个列表【英文标题】:Combine rows into a list in PrestoSQL 【发布时间】:2019-08-17 14:34:49 【问题描述】:

目前,我的表有三个不同的字段,id1id2actionsaction 是字符串类型。例如,我的表格类似于下面给出的表格:

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_JOINARRAY_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 数据帧行组合成一个

将sed截断x行组合成find命令

如何编辑这个 mySQL 以便将相同 id 的行组合成 1 而不是 3?

用于将子行组合成单行视图的 SQL 查询

我想将 t-sql 中的 json 行组合成单个 json 行

组合 Geopandas 数据框中的行