最近在做數據彙聚功能需要計算數據訪問成功率,原始的數據有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時必須在前面,這樣後面的表達式就不會執行, 就不會報錯
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!