Как устранить переполнение цифр c в Amazon Redshift - PullRequest
0 голосов
/ 03 марта 2020

У меня есть два столбца мер в данных 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              

Как решить это?

Ответы [ 2 ]

1 голос
/ 04 марта 2020

Вы получили ошибку «Разделить на ноль», потому что вы не обрабатывали знаменатель, равный нулю.

Решение: Добавьте nullif ,

Ну, вы сделали это НО вы также использовали «cast (... as decimal (3,2))», который дал вам ошибку «figureri c overflow», потому что вместо этого вы приводили необработанные значения (больше 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" одинаково для всех строк.

0 голосов
/ 03 марта 2020

Это приводит к ошибке деления на ноль.

Исправьте исходную проблему:

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

Это будет игнорировать строки, где colA + colB равно 0.

Очевидно, что ваши числа с плавающей точкой не поместятся в decimal(3,2). Поддерживаются только значения от 0,00 до 9,99.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...