You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:45:39