如何从贷款账户表中获取当前在贷业务的上一笔有效在贷账户?
解决方案
原查询仅通过MAX(date_last_disb)匹配上一笔贷款,当客户同一天有多笔贷款时,会返回所有同日期的贷款账户,无法精准定位到当前贷款之前的最后一笔。结合「获取当前在贷账户及其上一笔仍在贷账户」的需求,可通过窗口函数实现精准匹配:
方法1:使用LAG()窗口函数
LAG()函数可直接获取同一客户分组内上一条记录的指定字段,适配「取上一笔」的场景。需先筛选当前在贷账户,再关联其符合条件的历史在贷记录:
WITH ranked_loans AS ( SELECT cust_id, acct_no, close_date, date_last_disb, open_date, -- 按客户分组,先按放款日期倒序,再按开户日期倒序,确保排序唯一 LAG(acct_no) OVER (PARTITION BY cust_id ORDER BY date_last_disb DESC, open_date DESC) AS prev_loan_acct, LAG(close_date) OVER (PARTITION BY cust_id ORDER BY date_last_disb DESC, open_date DESC) AS prev_loan_close_date FROM acct_dtls ) SELECT cust_id, acct_no AS curr_loan, prev_loan_acct AS prev_loan FROM ranked_loans -- 筛选当前在贷的账户(未结清或结清日期晚于当前) WHERE (close_date IS NULL OR close_date > CURDATE()) -- 确保上一笔贷款也处于在贷状态 AND (prev_loan_close_date IS NULL OR prev_loan_close_date > CURDATE())
方法2:使用ROW_NUMBER()关联(兼容低版本数据库)
若数据库不支持LAG()函数,可通过ROW_NUMBER()为每个客户的贷款按时间排序,再关联序号相邻的记录:
WITH ranked_loans AS ( SELECT cust_id, acct_no, close_date, date_last_disb, open_date, -- 按客户分组,按放款+开户日期倒序排,给每笔贷款标记序号 ROW_NUMBER() OVER (PARTITION BY cust_id ORDER BY date_last_disb DESC, open_date DESC) AS loan_rank FROM acct_dtls ) SELECT curr.cust_id, curr.acct_no AS curr_loan, prev.acct_no AS prev_loan FROM ranked_loans curr LEFT JOIN ranked_loans prev ON curr.cust_id = prev.cust_id AND curr.loan_rank = prev.loan_rank + 1 -- 筛选当前在贷账户 WHERE (curr.close_date IS NULL OR curr.close_date > CURDATE()) -- 确保上一笔贷款也在贷 AND (prev.close_date IS NULL OR prev.close_date > CURDATE())
关键优化点
- 排序时同时使用
date_last_disb和open_date,避免同一天多笔贷款时排序混乱,保证取到真正的「最后一笔」。 - 补充了「当前在贷」的判断逻辑(原查询未覆盖),确保结果仅包含仍在贷的账户。
- 增加上一笔贷款的在贷状态校验,符合需求中「上一笔仍在贷」的要求。
内容的提问来源于stack exchange,提问作者Shodmoni Hikmatullozoda
相关产品推荐
相关产品推荐

