微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Clickhouse - 将 arrayMap 拆分为要排序的列

如何解决Clickhouse - 将 arrayMap 拆分为要排序的列

我有一个 Clickhouse 查询问题,我对 Clickhouse 还很陌生,所以对于专家来说,这可能是一个简单的问题;)!我们有一个包含事件的表,每个事件都链接一个产品 fe product_click、product_view。我想提取按产品分组的数据,但在一行中,我需要在一个单独的列中包含所有类型的事件,以便我可以对其进行排序。

我已经写了这个查询

SELECT product_id,arrayMap((x,y) -> (x,y),(arrayReduce('sumMap',[(groupArrayArray([event_type]) as arr)],[arrayResize(CAST([],'Array(UInt64)'),length(arr),toUInt64(1))]) as s).1,s.2) events
FROM events
GROUP BY product_id

结果:

┌─────────────────────────product_id───┬─events─────────────────────────────────────────────────────────────────────────────────────┐
│ 0071f1e4-a484-448e-8355-64e2fea98fd5 │ [('PRODUCT_CLICK',1341),('PRODUCT_VIEW',11)]                           │
│ 406f4707-6bad-4d3f-9544-c74fdeb1e09d │ [('PRODUCT_CLICK',1),122),('PRODUCT_BUY',37)]    │
│ 94566b6d-6e23-4264-ad76-697ffcfe60c4 │ [('PRODUCT_CLICK',1027),7)]                            │
...

有什么方法可以将 arrayMap 转换为带有排序键的列? 那么我们可以首先过滤点击次数最多的产品,还是浏览次数最多的产品?

一个问题,让这种查询始终执行是个好主意,还是我们应该为它创建一个 MATERIALIZED 视图?

谢谢!

解决方法

SQL 不允许可变数量的列。

唯一适合你的方法

SELECT product_id,countIf(event_type = 'PRODUCT_CLICK') PRODUCT_CLICK,countIf(event_type = 'PRODUCT_VIEW') PRODUCT_VIEW,countIf(event_type = 'PRODUCT_BUY') PRODUCT_BUY
FROM events
GROUP BY product_id

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。