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
我有一个 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