Oracle查询问题:按account_id获取指定类型的最新单条数据
Oracle:按account_id筛选指定类型并返回最新end_dt的单条记录
你的问题出在原SQL的GROUP BY同时包含了acct_id和sa_type_cd,导致每个账户下不同类型的记录会被单独分组,最终返回多条结果。要实现每个account_id仅返回符合类型条件的最新end_dt记录,可采用以下两种方案:
方案1:使用窗口函数ROW_NUMBER()(推荐)
通过窗口函数为每个账户的符合条件记录按end_dt降序编号,取编号为1的记录即可:
SELECT acct_id, sa_type_cd, end_dt FROM ( SELECT acct_id, sa_type_cd, end_dt, -- 按账户分区,按end_dt倒序排序,生成行号 ROW_NUMBER() OVER (PARTITION BY acct_id ORDER BY end_dt DESC) AS rn FROM test WHERE sa_type_cd IN ('E-RES', 'E-GS') ) t WHERE rn = 1;
说明:如果同一账户下有多个记录的end_dt相同且均为最新,ROW_NUMBER()会随机返回其中一条。若需保留所有最新记录,可将ROW_NUMBER()替换为RANK()。
方案2:使用关联子查询
先获取每个账户下符合类型的最大end_dt,再匹配对应的记录:
SELECT t.acct_id, t.sa_type_cd, t.end_dt FROM test t WHERE sa_type_cd IN ('E-RES', 'E-GS') AND t.end_dt = ( -- 子查询获取当前账户下符合类型的最新end_dt SELECT MAX(end_dt) FROM test WHERE acct_id = t.acct_id AND sa_type_cd IN ('E-RES', 'E-GS') );
说明:若同一账户下存在多条end_dt相同的最新记录,此方案会返回所有这些记录。
内容的提问来源于stack exchange,提问作者Brent
相关产品推荐
相关产品推荐

