Clickhouse 中的数组元素数

Array element count in clickhouse

我有一个 table 喜欢:

| key  | seq   |    words    |
|  '1' | '123' |['AAA', 'BBB']|
|  '1' | '456' |['AAA', 'CCC']|

我想获取键为“1”的每个元素的计数,例如

| key |         result_words         |
| '1' |[('AAA',2),('BBB',1),('CCC',1)|

我尝试了一些数组函数但失败了。最好的方法是什么?

create table test Engine=Memory as 
select  '1' key , '123' seq, ['AAA', 'BBB'] words union all
select  '1', '456' ,['AAA', 'CCC'];

SELECT
    key,
    arrayZip((sumMap(words, arrayResize(CAST([], 'Array(UInt64)'), length(words), 1)) AS x).1, x.2) AS r
FROM test
GROUP BY key

┌─key─┬─r───────────────────────────────┐
│ 1   │ [('AAA',2),('BBB',1),('CCC',1)] │
└─────┴─────────────────────────────────┘
SELECT key, groupArray((word, count)) AS result
FROM 
(
    SELECT key, word, count() AS count
    FROM 
    (
        /* Emulate the test dataset. */
        SELECT data.1 AS key, data.2 AS seq, data.3 AS words
        FROM 
        (
            SELECT arrayJoin([
                ('1', '123', ['AAA', 'BBB']), 
                ('1', '456', ['AAA', 'CCC'])]) AS data
        )
    )
    ARRAY JOIN words AS word
    GROUP BY key, word
)
GROUP BY key

/*
┌─key─┬─result──────────────────────────┐
│ 1   │ [('BBB',1),('AAA',2),('CCC',1)] │
└─────┴─────────────────────────────────┘
*/