如何通过数组列内容过滤 clickhouse table?
How to filter clickhouse table by array column contents?
我有一个 clickhouse table,它有一个 Array(UInt16) 列。我希望能够过滤此 table 的结果,以仅获取数组列中的值高于阈值的行。我一直在尝试使用一些数组函数(arrayFilter 和 arrayExists)来实现这一点,但我对 SQL/Clickhouse 查询语法不够熟悉,无法使其正常工作。
我创建了 table 使用:
CREATE TABLE IF NOT EXISTS ArrayTest (
date Date,
sessionSecond UInt16,
distance Array(UInt16)
) Engine = MergeTree(date, (date, sessionSecond), 8192);
距离值将是日期后特定秒数 (sessionSecond) 与特定点的距离。我添加了一些示例值,因此 table 如下所示:
现在我想获取包含距离大于 7 的所有行。我找到了数组运算符文档 here 并尝试了 arrayExists 函数,但它没有像我期望的那样工作。从文档中,它说这个函数 "Returns 1 if there is at least one element in 'arr' for which 'func' returns something other than 0. Otherwise, it returns 0"。但是当我 运行 下面的查询时,我得到三个零 returned 我应该得到一个 0 和两个零:
SELECT arrayExists(
val -> val > 7,
arrayEnumerate(distance))
FROM ArrayTest;
最终我想执行此 select,然后将其与 table 内容连接到只有 return 存在 exists = 1 的行,但我需要第一步才能工作在那之前。我使用 arrayExists 错了吗?我发现更令人困惑的是,当我将比较值更改为 2 时,我得到了所有 1。这种过滤可以用数组函数来实现吗?
谢谢
您可以在 WHERE 子句中使用 arrayExists。
SELECT *
FROM ArrayTest
WHERE arrayExists(x -> x > 7, distance) = 1;
另一种方法是使用 ARRAY JOIN,如果您需要知道哪些值大于 7:
SELECT d, distance, sessionSecond
FROM ArrayTest
ARRAY JOIN distance as d
WHERE d > 7
我认为你得到 3 个零的原因是 arrayEnumerate 枚举数组索引而不是数组值,并且因为你的 none 行有超过 7 个元素 arrayEnumerates 结果为 0所有行。
为了完成这项工作,
SELECT arrayExists(
val -> distance[val] > 7,
arrayEnumerate(distance))
FROM ArrayTest;
我有一个 clickhouse table,它有一个 Array(UInt16) 列。我希望能够过滤此 table 的结果,以仅获取数组列中的值高于阈值的行。我一直在尝试使用一些数组函数(arrayFilter 和 arrayExists)来实现这一点,但我对 SQL/Clickhouse 查询语法不够熟悉,无法使其正常工作。
我创建了 table 使用:
CREATE TABLE IF NOT EXISTS ArrayTest (
date Date,
sessionSecond UInt16,
distance Array(UInt16)
) Engine = MergeTree(date, (date, sessionSecond), 8192);
距离值将是日期后特定秒数 (sessionSecond) 与特定点的距离。我添加了一些示例值,因此 table 如下所示:
现在我想获取包含距离大于 7 的所有行。我找到了数组运算符文档 here 并尝试了 arrayExists 函数,但它没有像我期望的那样工作。从文档中,它说这个函数 "Returns 1 if there is at least one element in 'arr' for which 'func' returns something other than 0. Otherwise, it returns 0"。但是当我 运行 下面的查询时,我得到三个零 returned 我应该得到一个 0 和两个零:
SELECT arrayExists(
val -> val > 7,
arrayEnumerate(distance))
FROM ArrayTest;
最终我想执行此 select,然后将其与 table 内容连接到只有 return 存在 exists = 1 的行,但我需要第一步才能工作在那之前。我使用 arrayExists 错了吗?我发现更令人困惑的是,当我将比较值更改为 2 时,我得到了所有 1。这种过滤可以用数组函数来实现吗?
谢谢
您可以在 WHERE 子句中使用 arrayExists。
SELECT *
FROM ArrayTest
WHERE arrayExists(x -> x > 7, distance) = 1;
另一种方法是使用 ARRAY JOIN,如果您需要知道哪些值大于 7:
SELECT d, distance, sessionSecond
FROM ArrayTest
ARRAY JOIN distance as d
WHERE d > 7
我认为你得到 3 个零的原因是 arrayEnumerate 枚举数组索引而不是数组值,并且因为你的 none 行有超过 7 个元素 arrayEnumerates 结果为 0所有行。 为了完成这项工作,
SELECT arrayExists(
val -> distance[val] > 7,
arrayEnumerate(distance))
FROM ArrayTest;