【问题标题】:How to filter clickhouse table by array column contents?如何按数组列内容过滤clickhouse表?
【发布时间】:2018-05-15 11:10:54
【问题描述】:

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

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

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

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

现在我想获取所有包含距离大于 7 的行。我找到了数组运算符文档here 并尝试了 arrayExists 函数,但它没有按我的预期工作。从文档中,它说这个函数“如果'arr'中至少有一个元素'func'返回0以外的东西,则返回1。否则,它返回0”。但是当我运行下面的查询时,我得到了三个零,我应该得到一个 0 和两个 1:

SELECT arrayExists(
    val -> val > 7,
    arrayEnumerate(distance))
FROM ArrayTest;

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

谢谢

【问题讨论】:

    标签: clickhouse


    【解决方案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
    

    【讨论】:

    • 谢谢米哈伊尔,这很好用。我出于某种原因添加了arrayEnumerate,我认为这是问题所在。我还想知道您是否也可以查询数组中的索引?就像我想检查距离 [1] > 7 还是这是否是对数组功能的滥用,而应该使用列?
    • 是的,您可以检查数组中的特定元素SELECT * FROM ArrayTest WHERE distance[1] > 5
    • 谢谢米哈伊尔。现在一切正常。
    【解决方案2】:

    我认为你得到 3 个零的原因是 arrayEnumerate 枚举数组索引而不是数组值,并且由于你的行没有超过 7 个元素 arrayEnumerates 导致所有行都为 0。 为了完成这项工作,

    SELECT arrayExists(
        val -> distance[val] > 7,
        arrayEnumerate(distance))
    FROM ArrayTest;
    

    【讨论】:

      猜你喜欢
      • 2018-12-23
      • 1970-01-01
      • 2020-09-21
      • 2022-08-17
      • 1970-01-01
      • 2015-12-13
      • 1970-01-01
      • 2017-10-29
      • 1970-01-01
      相关资源
      最近更新 更多