首页 > 其他分享 >ClickHouse 实现数组交并差计算

ClickHouse 实现数组交并差计算

时间:2023-01-28 18:26:15浏览次数:57  
标签:arrayJoin arrayIntersect 函数 ClickHouse 数组 SQL 交并 SELECT

计算数组交集

函数: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/

https://cloud.tencent.com/developer/article/1961960

标签:arrayJoin,arrayIntersect,函数,ClickHouse,数组,SQL,交并,SELECT
From: https://www.cnblogs.com/-courage/p/17071051.html

相关文章

  • Js学习之 ----- 数组sort()排序
    数组的sort()方法会把数组中的元素转为字符串,然后根据字符串首位字符的Unicode码(或ASCII码)值来排序【默认从小到大】【ps:ASCII码是Unicode码的子集~】1、没有参数的情......
  • 力扣每日一题2023.1.28---1664. 生成平衡数组的方案数
    给你一个整数数组nums。你需要选择恰好一个下标(下标从0开始)并删除对应的元素。请注意剩下元素的下标可能会因为删除操作而发生改变。比方说,如果nums=[6,1,7,4,1]......
  • LeetCode-1664 生成平衡数组的方案树
    题目描述来源:力扣(LeetCode)链接:https://leetcode.cn/problems/ways-to-make-a-fair-array 给你一个整数数组 nums 。你需要选择恰好 一个下标(下标从0 开始)并删除......
  • Java数组的使用
    本文介绍了在java开发中经常使用的数组,以及数组的使用方法,注意事项。一.什么是数组1.数组:数组即是一堆逻辑上无序的元素的序列,用来存储多个相同类型的数据,数组可以看做是一......
  • Go 数组详解和实战
    数组是存放元素的容器,Go语言中数组的长度是数组类型的一部分,定义数组时必须指定存放元素的类型和容量(长度)定义vara1[3]boolvara2[4]intfmt.Printf("a1:%T\n......
  • 代码随想录-数组
    数组是一个非常基础的数据类型。数组是存放在连续内存空间上的相同类型数据的集合。下标从零开始,且元素从只能被覆盖不能被删除。题单704.二分查找704.二分查找题......
  • 算法入门--有序数组的平方
    给你一个按非递减顺序排序的整数数组nums,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。示例1:输入:nums=[-4,-1,0,3,10]输出:[0,1,9,16,100]解释:......
  • 【双指针】LeetCode 167. 两数之和 II - 输入有序数组
    题目链接167.两数之和II-输入有序数组思路本思路来自一张图告诉你O(n)的双指针解法的本质原理(C++/Java)下图是白色部分初始的搜索空间,即A[0]+A[7]假如targ......
  • js对象数组去重
    一个对象数组,根据传入的属性key对应的值来去重,实现方法如下,用双数组法,只要一次循环即可,时间复杂度低//对象数组去重arr=[{a:1},{a:2},{a:1},{a:3}]functiontodo(p......
  • 88. 合并两个有序数组
    题目描述给你两个按非递减顺序排列的整数数组nums1和nums2,另有两个整数m和n,分别表示nums1和nums2中的元素数目。请你合并nums2到nums1中,使合并后的数......