如何比较两个数组并在 Clickhouse 的数组中找到匹配项 (0/1)
How to compare two arrays and find the the match (0/1) in an array in Clickhouse
喜欢 Clickhouse 中的数组!
目前,我们正在尝试设计一个解决方案,要求我们找出 array1 中的元素是否存在于 array2 中,而不考虑顺序。
例如
array1= ['x','y','z']
array2= ['a','x','c']
Then the return that we want is [1,0,0]
- 是否有一种简单的开箱即用的方法来完成此操作?
- 这是一个更大查询的一部分,这意味着该数组比较的结果将用作 arrayMap((a,b) -> a*b, result, metric_array) 的一部分 --更多的是内联过滤。
- 如果有任何方法可以做到这一点,性能将大大提高!
提前致谢!
https://www.google.com.hk/amp/s/clickhouse.tech/docs/en/sql-reference/functions/array-functions/amp/
操作应该是
有(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','y','z'] │ ['a','x','c'] │ [1,0,0] │
└───────────────┴───────────────┴─────────┘
*/
这个解决方案看起来无效,但也可以检查一下:
SELECT
['x', 'y', 'z'] AS a1,
['a', 'x', 'c'] AS a2,
arrayIntersect(a1, a2) AS a3,
arrayMap(x -> has(a3, x), a1) AS result
/*
┌─a1────────────┬─a2────────────┬─a3────┬─result──┐
│ ['x','y','z'] │ ['a','x','c'] │ ['x'] │ [1,0,0] │
└───────────────┴───────────────┴───────┴─────────┘
*/
有点费解,但确实有效!
WITH
['x', 'y', 'z'] AS i,
['a', 'x', 'c'] AS j
SELECT arraySlice(arrayMap(m -> (m - 1), arrayEnumerateUniq(arrayConcat(j, i))), length(j) + 1) AS final
分步形式
WITH
['x', 'y', 'z'] AS i,
['a', '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
喜欢 Clickhouse 中的数组!
目前,我们正在尝试设计一个解决方案,要求我们找出 array1 中的元素是否存在于 array2 中,而不考虑顺序。
例如
array1= ['x','y','z']
array2= ['a','x','c']
Then the return that we want is [1,0,0]
- 是否有一种简单的开箱即用的方法来完成此操作?
- 这是一个更大查询的一部分,这意味着该数组比较的结果将用作 arrayMap((a,b) -> a*b, result, metric_array) 的一部分 --更多的是内联过滤。
- 如果有任何方法可以做到这一点,性能将大大提高!
提前致谢!
https://www.google.com.hk/amp/s/clickhouse.tech/docs/en/sql-reference/functions/array-functions/amp/
操作应该是
有(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','y','z'] │ ['a','x','c'] │ [1,0,0] │
└───────────────┴───────────────┴─────────┘
*/
这个解决方案看起来无效,但也可以检查一下:
SELECT
['x', 'y', 'z'] AS a1,
['a', 'x', 'c'] AS a2,
arrayIntersect(a1, a2) AS a3,
arrayMap(x -> has(a3, x), a1) AS result
/*
┌─a1────────────┬─a2────────────┬─a3────┬─result──┐
│ ['x','y','z'] │ ['a','x','c'] │ ['x'] │ [1,0,0] │
└───────────────┴───────────────┴───────┴─────────┘
*/
有点费解,但确实有效!
WITH
['x', 'y', 'z'] AS i,
['a', 'x', 'c'] AS j
SELECT arraySlice(arrayMap(m -> (m - 1), arrayEnumerateUniq(arrayConcat(j, i))), length(j) + 1) AS final
分步形式
WITH
['x', 'y', 'z'] AS i,
['a', '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