微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何比较两个数组并在 Clickhouse 的数组中找到匹配项0/1

如何解决如何比较两个数组并在 Clickhouse 的数组中找到匹配项0/1

喜欢 Clickhouse 中的数组!

目前,我们正在尝试设计一个解决方案,要求我们找出 array1 中的元素是否存在于 array2 中,而不管顺序。

例如

array1= ['x','y','z']
array2= ['a','x','c']

Then the return that we want is [1,0]

  1. 是否有一种简单的开箱即用的方法来实现这一点?
  2. 这是一个更大查询的一部分,这意味着该数组比较的结果将用作 arrayMap((a,b) -> a*b,result,metric_array) 的一部分——更多的是内联过滤。
  3. 如果有任何方法可以做到这一点,性能将大大提高!

提前致谢!

解决方法

https://www.google.com.hk/amp/s/clickhouse.tech/docs/en/sql-reference/functions/array-functions/amp/

操作应该是

has(arr,elem)

   SELECT has([1,2,NULL],NULL)
,

试试这个查询:

SELECT
    ['x','y','z'] AS a1,['a','x','c'] AS a2,arrayMap(x -> has(a2,x),a1) AS result

/*
┌─a1────────────┬─a2────────────┬─result──┐
│ ['x','z'] │ ['a','c'] │ [1,0] │
└───────────────┴───────────────┴─────────┘
*/

这个解决方案看起来无效,但也可以检查一下:

SELECT
    ['x',arrayIntersect(a1,a2) AS a3,arrayMap(x -> has(a3,a1) AS result

/*
┌─a1────────────┬─a2────────────┬─a3────┬─result──┐
│ ['x','c'] │ ['x'] │ [1,0] │
└───────────────┴───────────────┴───────┴─────────┘
*/
,

有点复杂,但肯定有效!

WITH 
    ['x','z'] AS i,'c'] AS j
SELECT arraySlice(arrayMap(m -> (m - 1),arrayEnumerateUniq(arrayConcat(j,i))),length(j) + 1) AS final

分步形式

WITH 
    ['x','c'] AS j
SELECT 
    arrayConcat(j,i) AS k,arrayEnumerateUniq(k) AS l,arrayMap(a -> (a - 1),l) AS m,arraySlice(m,length(j) + 1) AS final

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。