百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文
clickhouse填坑之除数为0完美解决

clickhouse填坑之除数为0完美解决

  • 网站名称:clickhouse填坑之除数为0完美解决
  • 网站分类:技术文章
  • 收录时间:2025-08-18 04:51
  • 网站地址:

进入网站

“clickhouse填坑之除数为0完美解决” 网站介绍

最近在做数据汇聚功能需要计算数据访问成功率,原始的数据有bug,会在出现访问总次数为0的情况,导致我们汇聚数据异常从而汇聚数据无法入库。为了解决这个问题,首先想到的就是if函数,于是我们使用if函数进行处理

1、if函数处理:

select 
if(sum(access)>0,toDecimal32(100*sum(service_success)/sum(access),2),0) 
  as business_visit_rate
from bigdata_analysis.ods_access 
group by s_province_id, c_province_id

按照我们的理解sum(access)=0,那么应该不会执行toDecimal32(100*sum(service_success)/sum(access),2),0),而实际情况就是


它并没有跳过除数为0的表达式的执行

2、使用三元运算处理:

将上面的if函数更换为三元运算

sum(access)>0?toDecimal32(100 * sum(service_success)/sum(access),2) : 0

执行后报错同上,也是出现一样的错误

3、使用intDivOrZero函数

intDivOrZero(100 * sum(service_success), sum(access))

可以解决除数为0,但是只能说整数,不能保留2位小数,又不满足条件

4、使用toFloat64进行处理

toFloat64(100 * sum(service_success))/toFloat64(sum(access)),


结果为NaN,于是放弃该方案

5、最终解决方案

if(sum(access)=0,0,round(100*sum(service_success)/sum(access),2)) 
  as busines_visit_rate

注意使用条件的顺序,为0时必须在前面,这样后面的表达式就不会执行, 就不会报错