左连接后浮点值减少

Float value decrease after left join

1st Table : AggregateValuesSum - SumProfit 和 NbC​​ustomers 按所有其他特征列分组计算。

Date        MonthStatus Gender   Age   Income   State   SumProfit  NbCustomers
2011-01-01  Status1     F        50    12000    CA       450000    3
2011-01-01  Status2     F        50    12000    CA       450000    2
2011-01-01  Status1     F        50    12000    CA       46000     2
2012-01-01  Status1     H        25    15000    NF       -500      1
2012-01-01  Status2     H        45    20000    QC       12000     5

2nd Table : AggregatesBudget - 与 AggregatesValueSum 相同 table,但没有 MonthStatus 列。 SumBudget 是按所有其他特征分组计算的(对于其他分析):

Date         Gender   Age   Income   State      SumBudget
2011-01-01   F        50    12000    CA         30000
2012-01-01   H        25    15000    NF         10000
2012-01-01   H        45    20000    QC         5000

Final table : ConsolidationTable - 在公共行(性别、年龄、收入、状态)。所以我拥有所有特征和所有计算值。

Date        MonthStatus Gender   Age   Income   State   SumProfit  NbCustomers  SumBudget
2011-01-01  Status1     F        50    12000    CA       450000    3            30000
2011-01-01  Status2     F        50    12000    CA       450000    2            30000
2011-01-01  Status1     F        50    12000    CA       46000     2            30000
2012-01-01  Status1     H        25    15000    NF       -500      1            -20000
2012-01-01  Status2     H        45    20000    QC       12000     5            5000

如您所见,对于具有相同特征的行,在不考虑 Sumprofit 和 MonthStatus 的情况下,SumBudget 在此最终 table 中重复。 (这是正常的)

目前看来一切都很好。然后我验证 SumBudget 每个 Date 的总数,并比较第二个 tables 和最终 table 给出的结果:

Select
 Date,
 Sum(SumBudget) as TotalBudgetPerDate
from AggregatesBudget
 group by Date

对于某些日期,当我这样做时它会给我不同的结果:

Select
  Date,
  Sum( distinct SumBudget)  as TotalBudgetPerDate
from ConsolidationTable
group by Date

问题:

我不明白为什么!

注意:这实际上是假数据,我有 49Md 行。由于敏感,我不会分享真实数据。

distinct SumBudget 将删除重复值。

Sum(distinct SumBudget)只会添加唯一值,导致某些日期的数据丢失。

如果您在单个日期的 aggregatesbudget table 中有重复的值(假设您总体上没有重复的键),则会发生这种情况。您可以使用以下方式检查:

select date, sumbudget, count(*)
from aggregatesbudget
group by date, sumbudget
having count(*) > 1;

可以使用window函数解决这个问题:

select date, sum(sumbudget)
from (select ct.*,
             row_number() over (partition by Gender, Age, Income, State, date order by date) as seqnum
      from ConsolidationTable ct
     ) ct
where seqnum = 1
group by date;