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

Allocation via SQL - Retaining repeating decimals for the sum()

我正在使用计算将单个单元分配到多行并将结果存储到 table 中。然后我 sum() 分配和总和导致数字不是整数。正在发生的事情是,一些分配以带有重复小数的数字结束,然后将那些未加起来的总和加回到整数(ala 1/3 + 1/3 + 1/3 != 1) .

我试过将数字转换成不同的格式,但是,Athena 一直以任意精度四舍五入小数,导致出现问题。

我希望分配的总和等于原始单位的总和。

我的数据库是 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

这是一般数据库或计算机的限制。当您处理这样的分数时,总会发生某种舍入。

我会对您从 table 中检索到的总和的第 x 位小数点进行合理的四舍五入,这将在最后删除这些剩余的小数位。

如果这对您来说还不够,您可以做的至少在理论上具有完全精度的操作是将分子和分母分别存储在两列中。在计算 sum( numerator_column/denominator_column ) 时,您会看到相同的舍入效果,因此对数字求和会有点复杂,如下所示:

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