SQL在列值匹配时选取指定列最大值行 实现账户日终余额查询
解决方案
方案1:窗口函数实现(兼容所有支持SQL:2003标准的主流数据库,如MySQL 8.0+、PostgreSQL、SQL Server、Oracle等)
这种写法可读性高、执行效率好,是优先推荐的方案:
SELECT Date, TransactionId, ClosingBalance, AccountId FROM ( SELECT *, ROW_NUMBER() OVER ( PARTITION BY AccountId, Date ORDER BY TransactionId DESC ) AS rn FROM 交易表名 -- 替换为你实际的表名 ) t WHERE rn = 1;
逻辑说明:
- 用
PARTITION BY AccountId, Date把数据按「账户+交易日期」分组,每个组就是单个账户单日的所有交易 - 组内按
TransactionId倒序排序,序号为1的就是当前组交易ID最大的记录,也就是当日最后一笔交易 - 最后过滤只保留序号为1的记录即可得到期望结果
方案2:子查询匹配实现(兼容不支持窗口函数的低版本数据库,如MySQL 5.x)
如果你的数据库版本比较老,不支持窗口函数,可以用这种写法:
SELECT t1.* FROM 交易表名 t1 INNER JOIN ( SELECT AccountId, Date, MAX(TransactionId) AS max_tid FROM 交易表名 GROUP BY AccountId, Date ) t2 ON t1.AccountId = t2.AccountId AND t1.Date = t2.Date AND t1.TransactionId = t2.max_tid;
逻辑说明:
- 先通过子查询统计出每个账户、每个日期对应的最大交易ID
- 再把原表和这个统计结果关联,匹配到对应最大交易ID的完整记录即可
两种方案执行后输出的结果和你给出的期望结果完全一致。
内容的提问来源于stack exchange,提问作者realmvpisme
相关产品推荐
相关产品推荐

