多列查询时如何保证A.CONTRACT_NUMBER列值唯一?
解决SQL查询中CONTRACT_NUMBER列重复的问题
你的查询出现重复的CONTRACT_NUMBER,核心原因是LEFT JOIN关联的B表(DM_FIN.FIN_LTV_DATAMART)中,同一个合同号对应多条记录。即使A表的CONTRACT_NUMBER是唯一主键,JOIN后也会被B表的多行数据“复制”,导致结果中出现重复的合同号。
另外你原查询中同时使用DISTINCT和GROUP BY属于冗余操作,GROUP BY本身就会对分组字段做去重,无需叠加DISTINCT。
以下是两种针对性的解决方案:
方案1:B表同一合同号的AMT_INTEREST_INCOME值唯一或只需任意一个
先对B表按合同号和利息收入去重,再与A表关联:
SELECT A.CONTRACT_NUMBER , A.DTIME_SIGNATURE , A.ID_CUID , A.CLIENT_SEGMENT , A.CLIENT_GENDER , A.CLIENT_AGE , A.CNT_SIGNED , A.AMT_SIGNED , A.INSTALMENTS , A.PRODUCT , B.AMT_INTEREST_INCOME FROM DM_SALES.V_SALES_DM_DATA A LEFT JOIN ( SELECT DISTINCT CONTRACT_NUMBER, AMT_INTEREST_INCOME FROM DM_FIN.FIN_LTV_DATAMART ) B ON A.CONTRACT_NUMBER = B.CONTRACT_NUMBER WHERE A.CONTRACT_STATE <> 'Cancelled' AND a.cnt_signed=1 AND A.LOAN_TYPE = 'Consumer Loan' AND TRUNC(A.DTIME_SIGNATURE) BETWEEN DATE'2022-08-01' AND DATE '2022-08-31' ORDER BY A.DTIME_SIGNATURE;
方案2:B表同一合同号有多个不同的AMT_INTEREST_INCOME,需聚合处理
如果需要对同一合同号的利息收入做统计(比如求和、取最大值),可以用聚合函数配合完整的GROUP BY:
SELECT A.CONTRACT_NUMBER , A.DTIME_SIGNATURE , A.ID_CUID , A.CLIENT_SEGMENT , A.CLIENT_GENDER , A.CLIENT_AGE , A.CNT_SIGNED , A.AMT_SIGNED , A.INSTALMENTS , A.PRODUCT , SUM(B.AMT_INTEREST_INCOME) AS AMT_INTEREST_INCOME -- 可替换为MAX/MIN等聚合函数 FROM DM_SALES.V_SALES_DM_DATA A LEFT JOIN DM_FIN.FIN_LTV_DATAMART B ON A.CONTRACT_NUMBER = B.CONTRACT_NUMBER WHERE A.CONTRACT_STATE <> 'Cancelled' AND a.cnt_signed=1 AND A.LOAN_TYPE = 'Consumer Loan' AND TRUNC(A.DTIME_SIGNATURE) BETWEEN DATE'2022-08-01' AND DATE '2022-08-31' GROUP BY A.CONTRACT_NUMBER , A.DTIME_SIGNATURE , A.ID_CUID , A.CLIENT_SEGMENT , A.CLIENT_GENDER , A.CLIENT_AGE , A.CNT_SIGNED , A.AMT_SIGNED , A.INSTALMENTS , A.PRODUCT ORDER BY A.DTIME_SIGNATURE;
内容的提问来源于stack exchange,提问作者Ragirate
相关产品推荐
相关产品推荐

