首页 > 解决方案 > 如何按不同的值将 clickhouse 中的 (value,count) 数组分组?

问题描述

例如,我有一个表 A

create table A (
    id Int64,
    discrete1 String
    discrete2 String
) engine=Log;

和一些数据

insert into A values
(1,'A','a')
(1,'B','b')
(1,'A','c')
(2,'C','a')
(1,'A','a');

我怎样才能选择这个结果,元组是(值,计数)

1,[(A,3),(B,1)],[(a,2),(b,1),(c,1)]
2,[(C,1)],[(a,1)]

我的表可能有许多离散值列,有没有办法在一次选择中做到这一点,而无需逐个按离散值列分组。

标签: clickhouse

解决方案


SELECT
    id,
    arrayMap((x, y) -> (x, y),
      (arrayReduce('sumMap', [(groupArrayArray([discrete1]) as arrdiscrete1)], 
              [arrayResize(CAST([], 'Array(UInt64)'), length(arrdiscrete1), toUInt64(1))]) as sdiscrete1).1,
      sdiscrete1.2) rdiscrete1,
    arrayMap((x, y) -> (x, y),
      (arrayReduce('sumMap', [(groupArrayArray([discrete2]) as arrdiscrete2)], 
              [arrayResize(CAST([], 'Array(UInt64)'), length(arrdiscrete2), toUInt64(1))]) as sdiscrete2).1,
      sdiscrete2.2) rdiscrete2
FROM A
GROUP BY id

┌─id─┬─rdiscrete1────────┬─rdiscrete2────────────────┐
│  2 │ [('C',1)]         │ [('a',1)]                 │
│  1 │ [('A',3),('B',1)] │ [('a',2),('b',1),('c',1)] │
└────┴───────────────────┴───────────────────────────┘

推荐阅读