我有一个带有1个Array(UInt16)列的Clickhouse表。我希望能够从该表中过滤结果,以仅获取其中数组列中的值高于阈值的行。我一直在尝试使用一些数组函数(arrayFilter和arrayExists)来实现这一点,但是我对SQL/Clickhouse查询语法不够熟悉,无法使其正常工作。

我使用以下方法创建了表:

CREATE TABLE IF NOT EXISTS ArrayTest (
    date Date,
    sessionSecond UInt16,
    distance Array(UInt16)
) Engine = MergeTree(date, (date, sessionSecond), 8192);

距离值将是距日期后一定秒数(sessionSecond)到某个点的距离。我添加了一些示例值,因此该表如下所示:

clickhouse - 如何按数组列内容过滤Clickhouse表?-LMLPHP

现在,我想获取所有包含大于7的距离的行。我找到了数组运算 rune 档here并尝试了arrayExists函数,但是它不能按我期望的那样工作。从文档中可以看出,此函数“如果'arr'中至少有一个元素的'func'返回值不是0,则返回1。否则,返回0”。但是,当我在下面运行查询时,返回三个零,我应该得到一个0和两个1:
SELECT arrayExists(
    val -> val > 7,
    arrayEnumerate(distance))
FROM ArrayTest;

最终,我想执行此选择,然后将其与表内容结合在一起,以仅返回存在= 1的行,但是在此之前,我需要第一步。我使用arrayExists错误吗?我发现更令人困惑的是,当我将比较值更改为2时,我得到的全是1。使用数组函数可以实现这种过滤吗?

谢谢

最佳答案

您可以在WHERE子句中使用arrayExists。

SELECT *
FROM ArrayTest
WHERE arrayExists(x -> x > 7, distance) = 1;

如果您需要知道哪个值大于7,则另一种方法是使用ARRAY JOIN:
SELECT d, distance, sessionSecond
FROM ArrayTest
ARRAY JOIN distance as d
WHERE d > 7

关于clickhouse - 如何按数组列内容过滤Clickhouse表?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47591813/

10-10 15:52