Teradata中按Agreement_ID重复行数分摊财务事件金额的问询
解决方案
你的原SQL问题在于使用了GROUP BY,这会将相同AGREEMENT_ID、PARTY_ID和FINANCIAL_EVENT_AMOUNT的行聚合为一行,而你需要保留所有重复记录,仅对每条记录的金额进行分摊计算。
正确的做法是使用窗口函数,通过COUNT(*) OVER(PARTITION BY AGREEMENT_ID)统计每个AGREEMENT_ID对应的重复行数,再用原金额除以这个次数得到分摊后的金额:
SELECT AGREEMENT_ID, PARTY_ID, FINANCIAL_EVENT_AMOUNT / COUNT(*) OVER(PARTITION BY AGREEMENT_ID) AS ALLOCATED_AMOUNT FROM DB.TABLENAME;
说明:
COUNT(*) OVER(PARTITION BY AGREEMENT_ID):为每条记录计算其所属AGREEMENT_ID分组内的总行数,也就是该ID的重复次数。- 执行后每条原始记录都会被保留,金额按重复次数平均分摊,总金额与原金额完全一致。
如果同一个AGREEMENT_ID下的PARTY_ID可能存在差异,但你仍希望按AGREEMENT_ID统一分摊金额,上述语句直接适用;若需要按AGREEMENT_ID + PARTY_ID的组合统计重复次数,只需将分区条件改为PARTITION BY AGREEMENT_ID, PARTY_ID即可。
内容的提问来源于stack exchange,提问作者user12722902
相关产品推荐
相关产品推荐

