如何获取每个Debtor对应最大LetterSeq的LetterDate及Comment信息?
获取每个债务人最后一封逾期信函的完整记录
错误原因说明
之前添加LetterDate和Comment字段报错,是因为SQL分组规则限制:SELECT中的字段要么包含在GROUP BY子句中,要么被聚合函数(如MAX()、MIN())包裹。直接添加未分组且未聚合的字段时,数据库无法确定要返回该债务人哪条记录的对应值,因此抛出错误。
解决方法
方法一:使用窗口函数(推荐,适用于MySQL 8+、SQL Server、PostgreSQL等现代数据库)
通过窗口函数给每个债务人的记录按LetterSeq倒序排名,筛选出排名第一的记录(即最后一封):
WITH RankedLetters AS ( SELECT DebtorID, LetterSeq, LetterDate, Comment, ROW_NUMBER() OVER (PARTITION BY DebtorID ORDER BY LetterSeq DESC) AS rn FROM DebtorOverdueLetterHistory ) SELECT DebtorID, LetterSeq, LetterDate, Comment FROM RankedLetters WHERE rn = 1;
方法二:子查询关联
先通过子查询获取每个DebtorID对应的最大LetterSeq,再关联原表匹配完整记录:
SELECT d.DebtorID, d.LetterSeq, d.LetterDate, d.Comment FROM DebtorOverdueLetterHistory d INNER JOIN ( SELECT DebtorID, MAX(LetterSeq) AS MaxLetterSeq FROM DebtorOverdueLetterHistory GROUP BY DebtorID ) m ON d.DebtorID = m.DebtorID AND d.LetterSeq = m.MaxLetterSeq;
方法三:子查询匹配(适用于不支持窗口函数的旧版本数据库)
通过关联子查询直接匹配每个债务人的最大LetterSeq对应的记录:
SELECT d.DebtorID, d.LetterSeq, d.LetterDate, d.Comment FROM DebtorOverdueLetterHistory d WHERE d.LetterSeq = ( SELECT MAX(LetterSeq) FROM DebtorOverdueLetterHistory WHERE DebtorID = d.DebtorID );
内容的提问来源于stack exchange,提问作者Wanita
相关产品推荐
相关产品推荐

