如何解决 Amazon Redshift 中的数字溢出问题

Posted

技术标签:

【中文标题】如何解决 Amazon Redshift 中的数字溢出问题【英文标题】:How to address numeric overflows in Amazon Redshift 【发布时间】:2020-03-03 07:34:01 【问题描述】:

我在 Redshift 数据中有两个度量列:

两列的数据类型均为Double Precision,大小为53

colA              colB
590437.223579   350213.276421
142069.091151   76554.205749
119372.370247   23001.207853
Null                Null
0                    0
678.345678           0
  0             24567.567866

我想做一些这样的操作:

sum(colA/(colA+ colB)) over (partition by some_other_col) as agg

它让我除以零错误。

所以我做到了:

sum(cast(colA as decimal(3,2)) /nullif((cast(colA as decimal(3,2)) + cast (colB as decimal(3,2))),0)) over (partition by some_other_col) as agg       

它再次向我抛出错误:

          InternalError_: Numeric data overflow (scale float to decimal)
        DETAIL:  
-----------------------------------------------
     error:  Numeric data overflow (scale float to decimal)
     code:      1058
     context:   64 bit overflow
     query:     3941320
   location:  numeric_bound.cpp:72              

如何解决?

【问题讨论】:

【参考方案1】:

您收到“除以零”错误,因为您没有处理分母为零。

解决方案:添加nullif

好吧,您这样做了,但是您还使用了“cast(...as decimal(3,2))”,这给了您“数字溢出”错误,因为您将原始值(大于 9.99)转换为十进制(3 ,2) 而不是铸造你的最终价值。

如果您确实希望您的答案设置为小数 (3,2),您可以这样做。但请确保您的实际答案不大于 9.99。

select cast(sum(colA /nullif((colA + colB),0)) over (partition by some_other_column) as decimal(3,2) ) as agg   
from table; 

注意:为简单起见,我假设所有行的“some_other_column”值相同。

【讨论】:

【参考方案2】:

它让我除以零错误。

修复你原来的问题:

sum(colA/nullif(colA + colB, 0)) over (partition by some_other_col) as agg

这将忽略 colA + colB 为 0 的行。

显然,您的浮点数不适合 decimal(3,2)。这只支持从 0.00 到 9.99 的值。

【讨论】:

@Mac 。 . .您无需强制转换即可解决除零问题。 除以问题已经解决,但没有解决问题..nullif我得到InternalError_: Numeric data overflow (scale float to decimal) error

以上是关于如何解决 Amazon Redshift 中的数字溢出问题的主要内容,如果未能解决你的问题,请参考以下文章

在 Amazon Redshift 中检查数字是整数还是浮点数

如何使用 Amazon Redshift 中的临时表列更新现有表中的列?

如何更改 Amazon Redshift 中的默认时区?

如何清除 Amazon Redshift 中的以下语法错误

仅当表存在时如何删除 Amazon Redshift 中的表

Amazon Redshift 中匹配序列数字的正则表达式