我正在尝试创建一个数据集,我根据另一列的值聚合列。举个例子
id | score | id2 | offensive
---------+-------+-----+-----------
a1 | 1.2 | 1 | false
a2 | 36.0 | 1 | true
a3 | 1.2 | 1 | true
a4 | 36.0 | 1 | false
我想要的是最终创建一个由两个列表组成的数组,由攻击列和与其相关的id组成,并按照得分值对它们进行排序。如下所示:
id |id2 | clean_group | offensive_group
---------+-----+-------------+-----------------
a1 | 1 | [a2, a3] | [a4, a1]
a2 | 1 | [a2, a3] | [a4, a1]
a3 | 1 | [a2, a3] | [a4, a1]
a4 | 1 | [a2, a3] | [a4, a1]
我知道这是冗余数据,但这是要求,应该注意id将是独特且唯一的,并且id2将是相同的。我一直在寻找presto中的array_agg
函数和hive中的collect_set
来尝试完成此操作,但遇到了很多麻烦。
有人可以帮忙吗?我们是否能够以某种方式在汇总条件中传递array_agg(id where offensive=true)
等等。
答案 0 :(得分:2)
我认为您希望使用过滤器语法进行聚合:array_agg(id) filter (where offensive)
。这只会处理与过滤器匹配的行。
答案 1 :(得分:1)
考虑到攻击性列是一个字符串,我认为这应该可以帮助你
SELECT
id,
id2,
CASE
WHEN offensive = 'true' then concat_ws(',',collect_set(id))
END AS clean_group,
CASE
WHEN offensive = 'false' then concat_ws(',',collect_set(id))
END AS offensive_group
FROM
table_name;