Impala笔记-保留小数位问题
问题描述
开发给了一段impala sql,表示Round函数保留小数位数时失效了,结果不准确。
一段代码(最终代码)
--需要使用Cast As Decimal
Select m.yn,
m.int_ts,
m.double_ts,
m.decimal_ts,
Round(m.double_ts, 2) r_double_ts,
Round(m.decimal_ts, 2) r_decimal_ts
From (Select o.yn,
Sum(o.ts) int_ts,
Avg(o.ts) double_ts,
Cast(Avg(o.ts) As Decimal(20, 3)) decimal_ts
From (SELECT Substr(a.zdate2, 1, 6) yn,
dateDiff('2019-07-31',
Concat(Substr(a.zin_date, 1, 4),
'-',
Substr(a.zin_date, 5, 2),
'-',
Substr(a.zin_date, 7, 2))) ts
FROM tab1 a, tab2 c
WHERE a.werks = c.gcbm
AND Substr(c.djrq, 1, 6) >= '201907') o
GROUP BY o.yn) m
结果如下:
问题分析
通过hue查看列类型时发现impala中Avg函数的返回类型为Double_Type,Round后的字段类型仍然是Double_Type;所以猜测将Avg的结果Cast为Decimal类型控制小数位(如上面的代码
)。
总结
这里还是不清楚为什么Avg在Round后会出现小数位补数的问题,只是为了解决问题而使用了Cast转为Decimal。还望各位不吝赐教。