【发布时间】:2019-03-06 15:28:22
【问题描述】:
我遇到了无法解释 Redshift 如何处理 SUM 划分的情况。
有示例表:
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;
我查看了有关 SUM 和 Computations with Numeric Values 的 Redshift 文档,但根据文档我仍然没有得到结果。
对表格列使用浮点数据类型不是一种选择,因为我需要存储精确的货币金额,而 15 位有效数字是不够的。
对 SUM 聚合使用强制转换也可以得到 0.6666666666666666666(19 位小数)。
select sum(a)::numeric(19,6)/sum(b) from public.datatype_test;
但它看起来不对,我不能强迫 BI 工具做这种变通方法,而且使用这些数据的每个人都不应该使用这种变通方法。
我尝试在 PostgreSQL 10 中使用相同的测试,它可以正常工作,返回足够数量的小数进行除法。
我可以对数据库设置做些什么来避免在 SQL Query 中进行强制转换吗? 非常感谢任何建议或指导。
红移版本: i686-pc-linux-gnu 上的 PostgreSQL 8.0.2,由 GCC gcc (GCC) 3.4.2 20041017 (Red Hat 3.4.2-6.fc3)、Redshift 1.0.4081 编译 使用 dc2.8xlarge 节点
【问题讨论】:
-
我建议您联系 AWS 支持并提供此信息
标签: sql amazon-redshift