【问题标题】:if group by sequence is not same , aggregated values are not same如果按序列分组不同,则聚合值不同
【发布时间】:2020-07-15 09:40:20
【问题描述】:

下面给出三个查询,用于从表 user_ 中获取聚合数据 每日成就。除了逐个分组之外,所有这些都是相同的。

select sum(jsm_amount) from (
select date,user_id,distributor_id,sum(user_daily_achievements.invoiced_amount) as jsm_amount from user_daily_achievements where date>='2020-06-01' and date<'2020-07-01'
group by date,user_id,distributor_id)a;

select sum(jsm_amount) from (
select date,distributor_id,user_id,sum(user_daily_achievements.invoiced_amount) as jsm_amount from user_daily_achievements where date>='2020-06-01' and date<'2020-07-01'
group by date,distributor_id,user_id)a;

select sum(jsm_amount) from (
select distributor_id,user_id,date,sum(user_daily_achievements.invoiced_amount) as jsm_amount from user_daily_achievements where date>='2020-06-01' and date<'2020-07-01'
group by distributor_id,user_id,date)a;

据我了解,这三种情况的总金额应该相同。但我在每个查询中得到不同的值。

数据库:Posgtres 版本:11

【问题讨论】:

  • 是的,值应该相同。这两个值是什么?
  • 我在三个不同的查询中得到这三个值:518547264、518547008 和 518546848
  • 您看到的差异很可能只是由于舍入错误。
  • 感谢它似乎是错误的四舍五入

标签: sql postgresql group-by


【解决方案1】:

我在处理之前将值转换为数字。这行得通。

select sum(jsm_amount) from (
select date,user_id,distributor_id,sum(user_daily_achievements.invoiced_amount::numeric) as jsm_amount from user_daily_achievements where date>='2020-06-01' and date<'2020-07-01'
group by date,user_id,distributor_id)a;

select sum(jsm_amount) from (
select date,distributor_id,user_id,sum(user_daily_achievements.invoiced_amount::numeric) as jsm_amount from user_daily_achievements where date>='2020-06-01' and date<'2020-07-01'
group by date,distributor_id,user_id)a;

select sum(jsm_amount) from (
select distributor_id,user_id,date,sum(user_daily_achievements.invoiced_amount::numeric) as jsm_amount from user_daily_achievements where date>='2020-06-01' and date<'2020-07-01'
group by distributor_id,user_id,date)a;

【讨论】:

  • 很好的答案,您刚刚证明(或多或少)问题是浮点运算导致的舍入误差。
猜你喜欢
  • 2014-05-10
  • 2019-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多