通过sql分配-保留sum()的重复小数

pgpifvop  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(278)

我使用一个计算将一个单元分配到多行,并将结果存储到一个表中。我是sum(),分配和求和的结果不是整数。正在发生的是,一些分配结果是带有重复小数的数字,然后那些没有加起来的数字的总和回到整数(ala 1/3+1/3+1/3!=1).
我试过将数字转换成不同的格式,但是雅典娜总是以任意精度将小数舍入,这就产生了问题。
我希望分配的总和等于原始单位的总和。
我的数据库是aws-athena,我知道它使用presto-sql语言。
我的分配示例:

case
  when count_of_visits = 1 then 1
  when count_of_visits = 2 then .5
  when count_of_visits >= 3 then
       case
         when visit_seq_number = min_visit_seq_number then .4
         when visit_seq_number = max_visit_seq_number then .4
         else .2 / (count_of_visits - 2 )
        end
   else 0
end as u_shp_alloc_leads

在这个分配中,第一次和最后一次访问将获得分配的40%,所有访问将被分成20%
一个被分配到29次访问的单元最终将20%除以27,等于 0.00740Repeating . 这张table正在储藏东西 0.007407407407407408 当我对这些数字求和时,结果是 1.0000000000000004 我希望结果是 1

mzillmmw

mzillmmw1#

这通常是数据库或计算机的限制。当你处理这样的分数时,总会有一些取整的情况发生。
我会对从表中检索到的和的第x位小数进行合理程度的舍入,这只会在最后去掉这些剩余的小数。
如果这对你来说还不够的话,你至少可以在理论上完全精确地将分子和分母分别存储在两列中。当计算总和(分子\列/分母\列)时,您将看到相同的舍入效果,因此对数字求和将变得更为复杂,如下所示:

SELECT sum(numerator_sum/denominator)
FROM (
  SELECT
    denominator,
    sum(numerator) as numerator_sum
  FROM your_allocation_table
  GROUP BY denominator
)

相关问题