Oracle SQL去重:保留H_POSAL_ID对应最后一条H_KACCT_ID记录
解决H_POSAL_ID重复问题:保留对应关系的最后一条记录
我来帮你搞定这个问题——你现在遇到的核心是同一个H_POSAL_ID因为和H_KACCT_ID的对应关系随时间变化,导致查询结果里出现重复的H_POSAL_ID,需要只保留每组对应关系里的最新一条记录。这里推荐用窗口函数ROW_NUMBER()来实现,这是处理这类分组取最新记录场景最常用的高效方案。
前提说明
首先得确认你的表(比如DRD_ORD或关联的其他表)里有能判断“最后一条”的字段,比如更新时间(UPDATE_TIME)、创建时间(CREATE_TIME),或者自增主键(比如ORD_ID)——下面示例我用UPDATE_TIME作为判断依据,如果你实际字段名不同,直接替换就行。
修改后的SQL语句
SELECT t.fixed_col1, t.fixed_col2, t.H_KACCT_BK, t.H_KACCT_ID, t.H_POSAL_BK, t.H_POSAL_ID FROM ( SELECT 'XXX' AS fixed_col1, 'JP' AS fixed_col2, ACC.H_KACCT_BK, LACC.H_KACCT_ID, HSAL.H_POSAL_BK, LACC.H_POSAL_ID, -- 按H_POSAL_ID分组,按更新时间倒序排序,最新记录的序号为1 ROW_NUMBER() OVER (PARTITION BY LACC.H_POSAL_ID ORDER BY LACC.UPDATE_TIME DESC) AS rn FROM DRD_ORD LACC INNER JOIN TRC_ORD ACC ON LACC.H_KACCT_ID = ACC.H_KACCT_ID AND LACC.SYS_DB_NAME = ACC.SYS_DB_NAME AND ACC.SYS_DB_NAME = 'JP' INNER JOIN H_SALES HSAL ON LACC.H_POSAL_ID = HSAL.H_POSAL_ID AND LACC.SYS_DB_NAME = HSAL.SYS_DB_NAME AND HSAL.SYS_DB_NAME = 'JP' WHERE LACC.SYS_DB_NAME = 'JP' AND LACC.H_POSAL_ID = 302774 ) t WHERE t.rn = 1;
关键逻辑解释
ROW_NUMBER()窗口函数:PARTITION BY LACC.H_POSAL_ID表示把数据按H_POSAL_ID分成不同的组,每个组内的记录再按UPDATE_TIME DESC(时间最晚的排在最前面)排序,给每条记录分配一个唯一序号rn。- 外层筛选:只保留
rn = 1的记录,也就是每个H_POSAL_ID对应的最新一条关联记录。
特殊情况处理
如果你的表中没有时间字段,也可以用自增主键来判断新旧(比如DRD_ORD的主键ORD_ID),只需要把排序条件换成ORDER BY LACC.ORD_ID DESC就行——因为自增主键值越大,通常表示记录创建/更新的时间越晚。
内容的提问来源于stack exchange,提问作者Marcus
相关产品推荐
相关产品推荐

