我有一个包含一个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)的某个点的距离。我添加了一些示例值,因此表格如下所示:
现在我想得到所有包含距离大于7的行。我找到了数组运算符文档here并尝试了arrayExists函数,但它没有按照我的预期工作。从文档中可以看出,如果'arr'中至少有一个元素为'func'返回0以外的其他元素,则返回1;否则返回0“。但是当我运行下面的查询时,我得到三个零,我应该得到一个0和两个:
SELECT arrayExists(
val -> val > 7,
arrayEnumerate(distance))
FROM ArrayTest;
最终我想执行此选择,然后将其与表内容连接,只返回存在= 1的行,但我需要在此之前完成第一步。我使用arrayExists错了吗?我发现更令人困惑的是,当我将比较值更改为2时,我得到所有1。使用数组函数可以实现这种过滤吗?
由于
答案 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;