Clickhouse - 拆分数组映射到要排序的列

Clickhouse - Split arrayMap to colums to sort on

我有一个 Clickhouse 查询问题,我对 Clickhouse 还很陌生,所以对于专家来说这可能是一个简单的问题 ;)!我们有一个包含事件的 table,每个事件都链接到一个产品 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 转换为带有排序键的列? 那么我们可以先筛选点击次数最多的产品,还是查看次数最多的产品?

另一个问题,总是执行这种查询是个好主意,还是我们应该为它创建一个具体化视图?

谢谢!

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