如何过滤三表inner join后的重复行,实现Accounting与Provider数据对账
解决方案
你得到4条冗余记录的核心原因是:Accounting关联Helper后得到2条同toid1的记录,再和Provider中2条同toid1的记录做inner join时触发了笛卡尔积,同toid1下的2*2=4条全匹配,没有加金额匹配的关联条件。
方案1:关联时直接加金额匹配条件(最优,从源头避免冗余数据)
直接在关联Provider的步骤就加上金额相等的判断,不需要后续再去重。
- SQL写法示例:
SELECT a.doc_nr, a.amount, h.toID, p.tID, p.DATE, p.tAmount FROM Accounting a INNER JOIN Helper h ON a.invoice = h.invoice INNER JOIN Provider p ON h.toID = p.toID AND a.amount = p.tAmount;
- Pandas写法示例:
import pandas as pd # 先关联Accounting和Helper acc_helper = pd.merge(Accounting, Helper, on='invoice', how='inner') # 关联Provider时同时加toID和金额匹配条件 result = pd.merge(acc_helper, Provider, left_on=['toID', 'amount'], right_on=['toID', 'tAmount'], how='inner')
方案2:基于已有4条中间结果过滤
如果已经生成了4条全量join结果,直接筛选amount = tAmount的行即可,不需要按doc_nr去重,自然就能得到2条符合要求的记录,每条doc_nr对应唯一匹配的tID和金额。
三类差异数据筛选补充(你最初的需求)
如果要完成你提到的三类数据筛选,可基于上述关联逻辑扩展实现:
- 仅在Accounting表存在、Provider表不存在的数据:用Accounting关联Helper后的结果左连Provider(加金额匹配条件),筛选
p.toID为空的记录 - 仅在Provider表存在、Accounting表不存在的数据:用Provider左连「Helper关联Accounting的结果」(加金额匹配条件),筛选
a.doc_nr为空的记录 - 两张表都存在但金额不匹配的数据:先按toID关联两边,筛选
a.amount <> p.tAmount的记录即可
内容的提问来源于stack exchange,提问作者A99
相关产品推荐
相关产品推荐

