Я столкнулся с ситуацией, когда не могу объяснить, как Redshift обрабатывает деление сумм.
Есть пример таблицы:
create table public.datatype_test(
a numeric(19,6),
b numeric(19,6));
insert into public.datatype_test values(222222.2222, 333333.3333);
insert into public.datatype_test values(444444.4444, 666666.6666);
Теперь я пытаюсь выполнить запрос:
select sum(a)/sum(b) from public.datatype_test;
Я получаю результат 0,6666 (4 знака после запятой).Он не связан с отображением инструмента, он действительно возвращает только 4 знака после запятой, и не имеет значения, большие или маленькие цифры в таблице.В моем случае 4 десятичных знака недостаточно точны.То же самое верно, если я использую AVG вместо SUM.
Если я использую MAX вместо SUM, я получаю: 0.6666666666666666666 (19 десятичных знаков).
Он также возвращает правильный результат (0.6666666666666667), если нетиспользуется физическая таблица:
with t as (
select 222222.2222::numeric(19,6) as a, 333333.3333::numeric(19,6) as b union all
select 444444.4444::numeric(19,6) as a, 666666.6666::numeric(19,6) as b
)
select sum(a)/sum(b) as d from t;
Я изучил документацию Redshift о SUM и вычислениях с числовыми значениями , но я все еще не получаю результат в соответствии сдокументация.
Использование типа данных float для столбцов таблицы не вариант, так как мне нужно хранить точные суммы в валюте, и 15 значащих цифр недостаточно.
Использование приведения к агрегации SUM также дает 0,6666666666666666666 (19десятичные дроби).
select sum(a)::numeric(19,6)/sum(b) from public.datatype_test;
Но это выглядит неправильно, и я не могу заставить инструменты BI делать этот обходной путь, также все, кто использует эти данные, не должны использовать этот тип обходного пути.
Я пытался использовать тот же тест в PostgreSQL 10, и он работает, как и должно, возвращая достаточное количество десятичных знаков для деления.
Могу ли я что-нибудьделать с настройкой базы данных, чтобы избежать приведения в SQL Query?Любые советы или рекомендации приветствуются.
Версия Redshift: PostgreSQL 8.0.2 для i686-pc-linux-gnu, скомпилированная GCC GCC (GCC) 3.4.2 20041017 (Red Hat 3.4.2-6.fc3), Redshift 1.0.4081 Использование больших узлов dc2.8x