1. avg求平均值的处理

简单的看,我们直接使用avg函数就可以满足了。但是数据中可能出现null值等特殊情况,如果需要将这部门也作为计算基数,那么就不能直接使用avg函数了。
解决方法:
直接使用函数:

select avg(id)
from t_two;

使用组合器过滤特殊字符:

select avgIf(id, isFinite(id))
from t_two;

使用求和之后计算平均值:

select 
sumIf(_A, isFinite(_A))/countIf(_A, isFinite(_A)) as __A 
from table_a

2. 聚合函数遇到无穷值和null值等特殊值

解决方法:使用函数过滤出符合条件的数据。

select
    countIf(decimal_finite, isFinite(toFloat64(decimal_finite)))
from table_30;

这里的countIf函数,是一个组合函数,增强了聚合函数的功能。

3. 聚合函数组合器:

函数组合器
-If
-OrDefault

4. 表达式中出现?时的处理

例如使用条件运算符,a ? b : c – 对应函数 if(a, b, c),jdbctemplate会识别错误,将?占位符识别为sql预处理需要的参数。
解决方法:改写sql成标准的clickhouse语法,避免语句中出现问号。
例子:

select avg(or(isNull(id), isInfinite(id)) = 1 ? 0 : id)
from t_two;

改写成:

select avg(if(equals(or(isNull(id), isInfinite(id)), 1), 0, id))
from t_two;

5. 遇到函数不支持的数据类型

其他函数
例如,isInfinite函数支持Float32和Float64类型的列,但是不支持decimal类型的数据。
解决方法:使用类型转换函数,例如toFloat64(),转换成符合要求的格式进行判断是否为无限数据。
类型转换函数的地址:
类型转换

6. 其他

逻辑函数

操作符

更多推荐

整理使用clickhouse函数经验(遇到的坑)