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

时间:2017-12-01 10:51:42

标签: clickhouse

我有一个包含一个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)的某个点的距离。我添加了一些示例值,因此表格如下所示:

Table with sample values

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

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

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

由于

2 个答案:

答案 0 :(得分:5)

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

MIDDLEWARE_CLASSES = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

另一种方法是使用ARRAY JOIN,如果你需要知道哪些值大于7:

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

答案 1 :(得分:0)

我认为您得到3个零的原因是arrayEnumerate枚举了数组索引而不是数组值,并且由于您的行没有多于7个元素,arrayEnumerates的所有行都为0。 为此,

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