【问题标题】:Clickhouse - Split arrayMap to colums to sort onClickhouse - 将数组映射到要排序的列
【发布时间】:2021-01-15 09:54:45
【问题描述】:

我有一个 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),('PRODUCT_VIEW',122),('PRODUCT_BUY',37)]    │
│ 94566b6d-6e23-4264-ad76-697ffcfe60c4 │ [('PRODUCT_CLICK',1027),('PRODUCT_VIEW',7)]                            │
...

有什么方法可以将 arrayMap 转换为带有排序键的列? 所以我们可以先筛选点击次数最多的产品,还是查看次数最多的产品?

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

谢谢!

【问题讨论】:

    标签: clickhouse


    【解决方案1】:

    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
    

    【讨论】:

    • 好吧 ;-)!感谢您的回复!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-04
    • 1970-01-01
    • 2020-07-04
    • 1970-01-01
    • 2012-02-29
    相关资源
    最近更新 更多