如何按COMPANY与NATURAL_PERSON筛选符合条件的最大FECHA_DE_REPORTE全行数据
解决SQL中最大审计日期对应记录不匹配的问题
你遇到的问题很典型——当用GROUP BY聚合时,非聚合列会返回组内的任意值,导致你拿到的FOLIO_CONSULTA和最大的FECHA_DE_REPORTE不是来自同一条记录。咱们一步步来修正这个问题:
需求回顾
- 先筛选出每个自然人(
NATURAL_PERSON)的审计日期(FECHA_DE_REPORTE)早于等于其所属公司首次放款日期(FIRST_LOAN)的所有记录 - 再对每个(公司
COMPANY+ 自然人NATURAL_PERSON)组合,取审计日期最新的那一行完整数据
原SQL的问题
你的查询用了GROUP BY来分组,但SELECT里的DIGITAL_SIGNATURE_ID、FOLIO_CONSULTA这些列没有被聚合,数据库会随机返回组内的某一条值,自然没法和MAX(FECHA_DE_REPORTE)对应上。
解决方案:用窗口函数精准定位目标行
最可靠的方法是用ROW_NUMBER()窗口函数,先筛选出符合日期条件的所有记录,再给每个分组内的记录按审计日期降序编号,取编号为1的那一行就是我们要的最新记录:
WITH filtered_records AS ( SELECT NPC.COMPANY_ID, NPC.NATURAL_PERSON_ID, NPS.DIGITAL_SIGNATURE_ID, CDC.FOLIO_CONSULTA, CDC.FECHA_DE_REPORTE, FIRST_LOAN.FIRST_LOAN, -- 按公司+自然人分组,审计日期降序编号,最新的行编号为1 ROW_NUMBER() OVER ( PARTITION BY NPC.COMPANY_ID, NPC.NATURAL_PERSON_ID ORDER BY CDC.FECHA_DE_REPORTE DESC ) AS rn FROM KONFIO.NATURAL_PERSON_COMPANY NPC LEFT JOIN KONFIO.NATURAL_PERSON_SIGNATURE NPS ON NPS.NATURAL_PERSON_ID = NPC.NATURAL_PERSON_ID JOIN KONFIO.CDC_RESPONSE CDC ON CDC.DIGITAL_SIGNATURE_ID = NPS.DIGITAL_SIGNATURE_ID JOIN ( SELECT CAPP.COMPANY_ID, MIN(LOAN.DOCUMENTATION_DATE) AS FIRST_LOAN FROM KONFIO.COMPANY_APPLICATION CAPP JOIN KONFIO.LOAN ON LOAN.APPLICATION_ID = CAPP.APPLICATION_ID GROUP BY CAPP.COMPANY_ID ) FIRST_LOAN ON FIRST_LOAN.COMPANY_ID = NPC.COMPANY_ID WHERE CDC.FECHA_DE_REPORTE <= FIRST_LOAN.FIRST_LOAN AND NPC.COMPANY_ID IN (1033) ) SELECT COMPANY_ID, NATURAL_PERSON_ID, DIGITAL_SIGNATURE_ID, FOLIO_CONSULTA, FECHA_DE_REPORTE, FIRST_LOAN FROM filtered_records WHERE rn = 1;
为什么这个方法有效?
filtered_recordsCTE先把所有符合日期条件的记录都查出来,同时用ROW_NUMBER()给每个(公司+自然人)组内的记录排序,最新的FECHA_DE_REPORTE对应rn=1- 最后只筛选
rn=1的行,就能确保拿到每个分组里审计日期最新的完整记录,不会出现列不匹配的问题
内容的提问来源于stack exchange,提问作者user11449055
相关产品推荐
相关产品推荐

