Amazon Athena中CASE语句差值超20%却返回空值的原因咨询
Athena CASE语句未返回预期值的原因分析
问题场景
在Amazon Athena中执行指定CASE语句时,当AreaBuilding与gla_sqft的绝对差值占gla_sqft的比例超过20%时,部分行的percent_diff_logic字段返回空值,而非预期的1。
执行的SQL语句
case when gla_sqft = AreaBuilding then 0 when ((abs(AreaBuilding- gla_sqft)/gla_sqft) > 0.2) then 1 else null end as percent_diff_logic
测试数据
| AreaBuilding | gla_sqft | percent_diff | percent_diff_logic |
|---|---|---|---|
| 1498 | 2100 | 0.2866666666666667 |
原因分析
问题核心是整数除法的截断特性:
AreaBuilding和gla_sqft均为整数类型,Athena中整数间的除法会直接舍弃小数部分,仅保留整数结果。- 以测试数据为例:
abs(1498-2100)=602,602/2100作为整数除法的结果是0,0与0.2比较时不满足>0.2的条件,因此进入else分支返回null。
解决方法
只需将除法操作中的任意一个操作数转为浮点类型,确保计算得到精确的小数结果,修改后的语句示例:
case when gla_sqft = AreaBuilding then 0 when ((abs(AreaBuilding - gla_sqft) / cast(gla_sqft as double)) > 0.2) then 1 else null end as percent_diff_logic
也可通过乘以1.0隐式转换为浮点型:
case when gla_sqft = AreaBuilding then 0 when ((abs(AreaBuilding - gla_sqft) * 1.0 / gla_sqft) > 0.2) then 1 else null end as percent_diff_logic
内容的提问来源于stack exchange,提问作者Ming-Lun Jimmy Wu
相关产品推荐
相关产品推荐

