在ClickHouse中匹配表数组元素并在新字段返回结果
ClickHouse 关联数组元素匹配生成结果数组
原始表结构与数据
假设目标表为your_table,结构定义如下:
CREATE TABLE your_table ( path String, arrKW Array(String) ) ENGINE = MergeTree() ORDER BY path;
表中原始数据:
| path | arrKW |
|---|---|
| folder/puntonet | ['kw1','kw2'] |
| folder/puntonet-2.0 | ['kw2','kw3'] |
| folder/puntonet-4 | ['kw2','kw4'] |
| folder/puntonet-5 | ['kw5','kw4'] |
解决方案SQL
SELECT t1.path, t1.arrKW, arrayFilter( x -> x != t1.path, arrayDistinct( arrayFlatten(groupArray(t2.path)) ) ) AS `Result Field` FROM your_table t1 LEFT JOIN your_table t2 ON arrayIntersect(t1.arrKW, t2.arrKW) != [] GROUP BY t1.path, t1.arrKW ORDER BY t1.path;
逻辑说明
- 自关联匹配:通过
LEFT JOIN将表与自身关联,关联条件为两条记录的arrKW数组存在交集元素(arrayIntersect结果非空)。 - 收集匹配路径:用
groupArray(t2.path)收集所有满足匹配条件的path,此时结果包含当前记录自身的path。 - 去重与扁平化:
arrayDistinct去除重复的path(同一记录可能因多个交集元素被多次匹配),arrayFlatten确保结果为一维数组。 - 过滤自身路径:
arrayFilter剔除与当前记录path相同的元素,得到最终符合要求的结果数组。
期望输出结果
| path | arrKW | Result Field |
|---|---|---|
| folder/puntonet | ['kw1','kw2'] | ['folder/puntonet-2.0','folder/puntonet-4'] |
| folder/puntonet-2.0 | ['kw2','kw3','kw5'] | ['folder/puntonet','folder/puntonet-5'] |
| folder/puntonet-4 | ['kw2','kw4'] | ['folder/puntonet','folder/puntonet-2.0'] |
| folder/puntonet-5 | ['kw5','kw4'] | ['folder/puntonet-2.0','folder/puntonet-4'] |
内容的提问来源于stack exchange,提问作者lino
相关产品推荐
相关产品推荐

