ClickHouse 实现数组交并差计算
计算数组交集
函数:arrayIntersect(arr1,arr2,...) 功能说明:计算 arr1,arr2等数组元素交集。 返回值:交集元素子数组。 SQL 实例:
SELECT arrayIntersect([1, 2, 3], [4, 5, 6]) AS noIntersect, arrayIntersect([1, 2, 3], [2, 3, 4, 5, 6]) AS hasIntersect FORMAT Vertical |
输出: noIntersect: [] ; hasIntersect: [3,2]
计算数组并集
组合使用函数来实现arrayDistinct(arrayConcat(a, b))。 SQL 实例:
SELECT [1, 2] AS a, [2, 3] AS b, arrayDistinct(arrayConcat(a, b)) AS res FORMAT Vertical |
输出: a: [1,2] b: [2,3] res: [1,2,3]
计算数组差集
差集的实现要有一些技术含量了(感觉 ClickHouse 后面应该内置数组差集计算函数,实现类似arrayExcept() 函数),需要使用数组交集函数arrayIntersect() 结合高阶函数 arrayMap()和 arrayFilter()来组合实现。 SQL 实例:SELECT arrayIntersect([1, 2, 3], [4, 5, 6]) AS noIntersect, arrayIntersect([1, 2, 3], [2, 3, 4, 5, 6]) AS hasIntersect FORMAT Vertical SELECT [1, 2] AS a, [2, 3] AS b, arrayFilter(x -> (x IS NOT NULL ), arrayMap(x -> multiIf(x NOT IN arrayIntersect(a, b), x, NULL ), a)) AS res FORMAT Vertical |
输出: a: [1,2] b: [2,3] res: [1]
另外可以使用 交(INTERSECT)、并(UNION)、差(EXCEPT)的SQL子句关键字 实现
另外, ClickHouse 中有集合交(INTERSECT)、并(UNION)、差(EXCEPT)的SQL子句关键字,可以实现数组的交并差运算。实例 SQL 如下。
交集SQL:
SELECT a.i FROM ( SELECT arrayJoin([1, 2]) AS i ) AS a INTERSECT SELECT b.i FROM ( SELECT arrayJoin([2, 3]) AS i ) AS b |
输出:2
并集 SQL:
SET union_default_mode = 'ALL' ; SELECT DISTINCT t.i FROM ( SELECT a.i FROM ( SELECT arrayJoin([1, 2]) AS i ) AS a UNION SELECT b.i FROM ( SELECT arrayJoin([2, 3]) AS i ) AS b ) AS t |
输出: 1 2 3
差集 SQL:
SELECT a.i FROM ( SELECT arrayJoin([1, 2]) AS i ) AS a EXCEPT SELECT b.i FROM ( SELECT arrayJoin([2, 3]) AS i ) AS b |
输出:1 注:上述[1,2]和[2,3]分别表示要求差集的数组
数据函数解释:
arrayIntersect表示多个数组求交集
arrayConcat表示连接多个数组为一个数组
arrayDistinct表示将多个数组元素去重组合为一个数组
arrayMap表示使用lambda函数转换
arrayFilter表示使用lambda函数过滤
参考:https://clickhouse.tech/docs/zh/sql-reference/functions/higher-order-functions/
posted on 2023-01-28 18:06 RICH-ATONE 阅读(702) 评论(0) 编辑 收藏 举报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
2022-01-28 Nginx安装
2021-01-28 hive报错Exception in thread "main" java.lang.OutOfMemoryError: PermGen space