我需要将WHERE子句中的主机数量作为偏移量传递给"Neighbor"语句,但当我运行以下语句时:

WITH (
    SELECT COUNT(distinct hostname)
    FROM data.table
    WHERE timestamp >= (NOW() - INTERVAL 1 HOUR)
      AND hostname IN ('host1', 'host2')
) AS req_hosts
SELECT NEIGHBOR(current_val, req_hosts) AS prev_val,
       (100 - ((current_val - prev_val)/ 60)* 100)
FROM data.table
WHERE hostname IN ('host1', 'host2');

我收到错误:

代码:43.DB::异常:函数Neighbor的第二个参数的非法类型Null(UInt64)-应为整数:处理(Neighbor(Current_val,_cast(163980,‘Nullable(UInt64)’)as Req_Hosts)as prev_val)!=0.(非法参数类型)

我try 使用toUnIt64()/toInt64(),它仍然显示Nullable(Int64)是非法的.请帮帮忙.

先谢谢你.

推荐答案

在ClickHouse SQL中,将Neighbor函数与CTE(公用表表达式)一起使用并将数字作为偏移量传递时,需要确保数据类型为不可为空的整数类型.您遇到的错误表明邻居函数不接受Nullable(UInt64)或Nullable(Int64)数据类型.

若要解决此问题,可以使用CAST函数将计数聚合的结果转换为不可为空的整数类型.以下是您的查询的更新版本:

WITH
(
    SELECT CAST(COUNT(hostname) AS Int64)
    FROM data.table
    WHERE timestamp >= (NOW() - INTERVAL 1 HOUR)
      AND hostname IN ('host1', 'host2')
) AS req_hosts
SELECT NEIGHBOR(current_val, req_hosts) AS prev_val,
       (100 - ((current_val - prev_val) / 60) * 100)
FROM data.table
WHERE hostname IN ('host1', 'host2');

在本例中,CAST函数用于将COUNT(主机名)的结果转换为Int64,Int64是与Neighbor函数兼容的不可为空的整数类型.

Sql相关问答推荐

在SQL Server中使用LEFT连接包含特定记录

如何在SQL查询中只比较日期时间的年份和月份(而忽略日期比较)?

基于时间的SQL聚合

有没有一种正确的方法来利用SQL UNION来从三个潜在查询中 Select 最大值?

从以前的非空值行中获取值

SQL—如何根据2列填写缺失的值

不可能在SQL MERGE子句中引发异常

前面的语句不喜欢AND LIKE?当try 更新使用ID和日期过滤的表时

在多个柱上连接时,如何确定连接条件?

分组多输出访问查询问题

Access VBA SQL命令INSERT FOR MULTIME VALUE

Oracle SQL根据列中的条件 Select 最大记录数

每小时 Select 1行

同时插入和更新记录

在 PostgreSQL 中使用 ltree 列进行累积

从另一个没有公共键的表中获取值来加入

Postgresql - 如何根据阈值计算累积和

如何在sparksql查询中使用日期值?

每个ID的SQL返回可能的最低级别及其值

获取 SQL Server 中每一行的两个-之间的文本