Clickhouse SELECT 具有特定顺序的所有元素的数组值
Clickhouse SELECT Array values that have all elements in a specific order
我需要找到一个数组,其中包含另一个数组的所有值,按照呈现的顺序 - 类似于 'hasString' 或 'hasAll' - 或如何解决这个问题的想法。
示例数据
dataCol = [1,2,3,4]
有子字符串
hasSubstr 很接近,但是如果值不完全匹配,则它们不匹配。
hasSubstr(dataCol, [1,2,4])
将 return 0
但是我在这里需要一个 1,因为 1、2 和 4 在 dataCol 中的顺序是 1 然后 2 然后 4。
都有
hasAll
也很接近,但它不关心顺序。
hasAll(dataCol, [4,2,1])
将 return 1
但是我这里需要一个0,因为顺序不对
函数还是查询?
等同于 'imaginary' 函数的东西:hasAllOrdered(dataCol, [1,3,4])
= 1
或者关于如何为此构建查询的想法。也许是 hasAll 和一些查询逻辑魔术的组合?
编辑:为了阐明我的预期结果,我需要 运行 查询 select 多个列,因为可以与一个函数一起使用。
SELECT
path AS dataCol,
track
FROM tracks
WHERE time_start > 1645232556
AND { magic here returning rows containing [276,277,279] in dataCol }
LIMIT 10
Query id: cac9b576-193e-475f-98e4-84354bf13af4
┌─dataCol───────────────────────────────────┬──track─┐
│ [211,210,207,205,204] │ 413354 │
│ [211,210,207,205,204] │ 413355 │
│ [73,74,142,209,277,276,208] │ 413356 │
│ [73,74,142,209,277,276,208] │ 413357 │
│ [280,279] │ 413358 │
│ [280,279] │ 413359 │
│ [272,208,276,277,278,346,347,273,206,207] │ 413360 │
│ [208,276,277,278,346,272,273,206,207,347] │ 413361 │
│ [276,277,278,279,348,208,209,141] │ 413362 │
│ [141,276,208,209,277,278,279,348] │ 413363 │
└───────────────────────────────────────────┴────────┘
10 rows in set. Elapsed: 0.007 sec. Processed 13.59 thousand rows, 273.88 KB (1.86 million rows/s., 37.49 MB/s.)
参考:https://clickhouse.com/docs/en/sql-reference/functions/array-functions/
你有 2 个数组 [a, b] 和 [a,b]
让我们通过第一个 (indexOf + arrayMap) 的索引构建第二个数组 === [a,d,b] --> [1,0,2],通过 indexOf 删除零 d
( <> 0) --> [1,2]
现在我们只有在索引增长时才需要数组,否则元素的顺序是错误的。
arrayDifference == [1,2] -> [0,1]。现在,如果这个数组有负元素,那么索引就不会增长
-- 不是 arrayExists j < 0
create table tracks( dataCol Array(UInt64), track UInt64 ) Engine = Memory;
insert into tracks values
( [211,210,207,205,204] , 413354)
( [211,210,207,205,204] , 413355)
( [280,279] , 413358)
( [280,279] , 413359)
( [272,208,276,277,278,346,347,273,206,207], 413360)
( [208,276,277,278,346,272,273,206,207,347], 413361)
( [276,277,278,279,348,208,209,141] , 413362)
( [141,276,208,209,277,278,279,348] , 413363);
select *
from tracks
where hasAll(dataCol, [276,277,279] as x ) and not arrayExists(j -> j<0, arrayDifference(arrayFilter(i->indexOf(dataCol, i)<>0, x)))
┌─dataCol───────────────────────────┬──track─┐
│ [276,277,278,279,348,208,209,141] │ 413362 │
│ [141,276,208,209,277,278,279,348] │ 413363 │
└───────────────────────────────────┴────────┘
我需要找到一个数组,其中包含另一个数组的所有值,按照呈现的顺序 - 类似于 'hasString' 或 'hasAll' - 或如何解决这个问题的想法。
示例数据
dataCol = [1,2,3,4]
有子字符串
hasSubstr 很接近,但是如果值不完全匹配,则它们不匹配。
hasSubstr(dataCol, [1,2,4])
将 return 0
但是我在这里需要一个 1,因为 1、2 和 4 在 dataCol 中的顺序是 1 然后 2 然后 4。
都有
hasAll
也很接近,但它不关心顺序。
hasAll(dataCol, [4,2,1])
将 return 1
但是我这里需要一个0,因为顺序不对
函数还是查询?
等同于 'imaginary' 函数的东西:hasAllOrdered(dataCol, [1,3,4])
= 1
或者关于如何为此构建查询的想法。也许是 hasAll 和一些查询逻辑魔术的组合?
编辑:为了阐明我的预期结果,我需要 运行 查询 select 多个列,因为可以与一个函数一起使用。
SELECT
path AS dataCol,
track
FROM tracks
WHERE time_start > 1645232556
AND { magic here returning rows containing [276,277,279] in dataCol }
LIMIT 10
Query id: cac9b576-193e-475f-98e4-84354bf13af4
┌─dataCol───────────────────────────────────┬──track─┐
│ [211,210,207,205,204] │ 413354 │
│ [211,210,207,205,204] │ 413355 │
│ [73,74,142,209,277,276,208] │ 413356 │
│ [73,74,142,209,277,276,208] │ 413357 │
│ [280,279] │ 413358 │
│ [280,279] │ 413359 │
│ [272,208,276,277,278,346,347,273,206,207] │ 413360 │
│ [208,276,277,278,346,272,273,206,207,347] │ 413361 │
│ [276,277,278,279,348,208,209,141] │ 413362 │
│ [141,276,208,209,277,278,279,348] │ 413363 │
└───────────────────────────────────────────┴────────┘
10 rows in set. Elapsed: 0.007 sec. Processed 13.59 thousand rows, 273.88 KB (1.86 million rows/s., 37.49 MB/s.)
参考:https://clickhouse.com/docs/en/sql-reference/functions/array-functions/
你有 2 个数组 [a, b] 和 [a,b]
让我们通过第一个 (indexOf + arrayMap) 的索引构建第二个数组 === [a,d,b] --> [1,0,2],通过 indexOf 删除零 d
( <> 0) --> [1,2]
现在我们只有在索引增长时才需要数组,否则元素的顺序是错误的。
arrayDifference == [1,2] -> [0,1]。现在,如果这个数组有负元素,那么索引就不会增长 -- 不是 arrayExists j < 0
create table tracks( dataCol Array(UInt64), track UInt64 ) Engine = Memory;
insert into tracks values
( [211,210,207,205,204] , 413354)
( [211,210,207,205,204] , 413355)
( [280,279] , 413358)
( [280,279] , 413359)
( [272,208,276,277,278,346,347,273,206,207], 413360)
( [208,276,277,278,346,272,273,206,207,347], 413361)
( [276,277,278,279,348,208,209,141] , 413362)
( [141,276,208,209,277,278,279,348] , 413363);
select *
from tracks
where hasAll(dataCol, [276,277,279] as x ) and not arrayExists(j -> j<0, arrayDifference(arrayFilter(i->indexOf(dataCol, i)<>0, x)))
┌─dataCol───────────────────────────┬──track─┐
│ [276,277,278,279,348,208,209,141] │ 413362 │
│ [141,276,208,209,277,278,279,348] │ 413363 │
└───────────────────────────────────┴────────┘