tft每日頭條

 > 圖文

 > clickhouse填坑之除數為0完美解決

clickhouse填坑之除數為0完美解決

圖文 更新时间:2024-12-16 20:58:38

最近在做數據彙聚功能需要計算數據訪問成功率,原始的數據有bug,會在出現訪問總次數為0的情況,導緻我們彙聚數據異常從而彙聚數據無法入庫。為了解決這個問題,首先想到的就是if函數,于是我們使用if函數進行處理

clickhouse填坑之除數為0完美解決(clickhouse填坑之除數為0完美解決)1

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),而實際情況就是

clickhouse填坑之除數為0完美解決(clickhouse填坑之除數為0完美解決)2

它并沒有跳過除數為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)),

clickhouse填坑之除數為0完美解決(clickhouse填坑之除數為0完美解決)3

結果為NaN,于是放棄該方案

5、最終解決方案

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

注意使用條件的順序,為0時必須在前面,這樣後面的表達式就不會執行, 就不會報錯

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关圖文资讯推荐

热门圖文资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved