Clickhouse 数组字段 - 检查是否有任何项目满足条件
Clickhouse Array Field - Check if ANY of the items meets condition
在我的 Clickhouse 服务器中,我有一个 table 和一个 整数数组 字段:
CREATE TABLE my_table
(
...
my_array_field Array(UInt32),
...
)
非常简单的定义。
但是现在我想过滤符合这样条件的记录:
my_array_field里面的任何一项都在5000到6000之间
在 postgres 我做了这样的事情:
SELECT * FROM my_table WHERE EXISTS
(
SELECT 1 FROM unnest(my_array_field) AS my_array_field WHERE my_array_field BETWEEN 5000 AND 6000
)
但现在我在 clickhouse 遇到了同样的挑战,需要一些帮助。
提前致谢!
尝试使用arrayJoin函数:
SELECT
*,
arrayJoin(my_array_field) AS val
FROM my_table
WHERE val BETWEEN 5000 AND 6000
查找详细信息ARRAY JOIN Clause。
如果遇到一些性能问题,考虑添加两个额外的列来存储数组中的 max 和 min 值:
CREATE TABLE my_table
(
...
my_array_field Array(UInt32),
UInt32 min_my_array_field,
UInt32 max_my_array_field,
...
)
INSERT INTO my_table
VALUES (.., arr, arrayMin(arr), arrayMax(arr), ..)
SELECT
*,
arrayJoin(my_array_field) AS val
FROM
(
SELECT *
FROM my_table
WHERE (min_my_array_field <= 6000) AND (max_my_array_field >= 5000)
)
WHERE val BETWEEN 5000 AND 6000
看skipping indexes:例如bloom_filter支持数组类型。
select * from my_table
where arrayExists( i -> (i > 5000 and i < 6000) , my_array_field)
在我的 Clickhouse 服务器中,我有一个 table 和一个 整数数组 字段:
CREATE TABLE my_table
(
...
my_array_field Array(UInt32),
...
)
非常简单的定义。
但是现在我想过滤符合这样条件的记录:
my_array_field里面的任何一项都在5000到6000之间
在 postgres 我做了这样的事情:
SELECT * FROM my_table WHERE EXISTS
(
SELECT 1 FROM unnest(my_array_field) AS my_array_field WHERE my_array_field BETWEEN 5000 AND 6000
)
但现在我在 clickhouse 遇到了同样的挑战,需要一些帮助。
提前致谢!
尝试使用arrayJoin函数:
SELECT
*,
arrayJoin(my_array_field) AS val
FROM my_table
WHERE val BETWEEN 5000 AND 6000
查找详细信息ARRAY JOIN Clause。
如果遇到一些性能问题,考虑添加两个额外的列来存储数组中的 max 和 min 值:
CREATE TABLE my_table
(
...
my_array_field Array(UInt32),
UInt32 min_my_array_field,
UInt32 max_my_array_field,
...
)
INSERT INTO my_table
VALUES (.., arr, arrayMin(arr), arrayMax(arr), ..)
SELECT
*,
arrayJoin(my_array_field) AS val
FROM
(
SELECT *
FROM my_table
WHERE (min_my_array_field <= 6000) AND (max_my_array_field >= 5000)
)
WHERE val BETWEEN 5000 AND 6000
看skipping indexes:例如bloom_filter支持数组类型。
select * from my_table
where arrayExists( i -> (i > 5000 and i < 6000) , my_array_field)