Impala笔记-保留小数位问题

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

结果如下: Impala笔记-保留小数位问题

问题分析

通过hue查看列类型时发现impala中Avg函数的返回类型为Double_Type,Round后的字段类型仍然是Double_Type;所以猜测将Avg的结果Cast为Decimal类型控制小数位(如上面的代码)。
Impala笔记-保留小数位问题

总结

这里还是不清楚为什么Avg在Round后会出现小数位补数的问题,只是为了解决问题而使用了Cast转为Decimal。还望各位不吝赐教。

上一篇:Spring MVC-HttpMessageConverter


下一篇:Oracle 之 SQL 面试题 录(转)