当标签是字符串数组时,如何计算SQL中每个标签的项目数?

问题描述

我有一个看起来像这样的表: ItemID,Tags

ItemID是一个字符串,Tags是一个字符串数组。

数据库引擎是Presto:https://prestodb.io/docs/0.172/index.html

我必须为每个标签返回一个ItemID的计数,但是我有点被卡住了。我的第一种方法提取标签并创建一个唯一列表,然后我希望通过某种加入魔术,我能够分组再计数。

该如何处理?我对sql数组没有很多经验?

我也无法弄清楚如何使用UNnesT创建行,然后创建表:

SELECT filter(flatten(array_agg(split(tags,','))),x -> x != '')
FROM my_items

这将返回一个唯一标签数组,显然使用UNnesT可以将其转换为一组行,但是到目前为止我没有运气将其转换为行。尝试过类似的东西:

SELECT UNnesT(above subquery) FROM MY_ITEMS

解决方法

我认为您需要unnest()和聚合:

select t.tag,count(*)
from my_items i cross join
     unnest(split(i.tags,',')) t(tag)
group by t.tag;
,

不太确定,因为我还无法在Presto上尝试。但是cardinality函数可能会起作用。

cardinality(x) → bigint -- Returns the cardinality (size) of the array x.

来自Presto文档-https://prestodb.io/docs/current/functions/array.html