首页 > 解决方案 > 需要检索表的最后插入/更新的记录并排除一些例外

问题描述

我正在尝试检索表 SHIPMENT_EVENT 中插入/更新的最后一条记录。有一些事件/代码是不需要的,例如所有以“9”开头的事件/代码。问题是这些事件总是最后一个发送,但对我来说最不重要,所以我需要显示最后一个事件,但如果这是一个 9X 事件,那么它不应该显示它,而是应该继续查找对于最后一个不是 9X 的事件,直到达到要显示的有效代码。

这是我认为对我的案子有帮助的代码。这个左连接应该检查事件表并检索最后一个事件。但是,通过深入测试发现它显示的是 NULL,而最后一个事件是 9X。

我尝试将 NOT LIKE 子句移到第一个块之外,但结果相同。我注意到直接删除不喜欢时这是错误的,我最终得到了 9X 事件的所有结果。

left join 

(    select ship_id, ship_to_loc_cd856, ship_evnt_cd, updt_job_tms, 
carr_tracking_num, event_srv_lvl
         FROM
         (   select  ship_id, ship_to_loc_cd856, ship_evnt_cd, 
updt_job_tms, carr_tracking_num, event_srv_lvl
            ,        row_number() over(partition by ship_id order by 
updt_job_tms desc) as RN
          FROM     shipment_event
         ) s
         WHERE RN = 1  and ship_evnt_cd not like ('9%')
        )  AS lscus
ON        scus.ship_id=lscus.ship_id and 
scus.ship_to_loc_code=lscus.ship_to_loc_cd856

我需要逻辑来检查最近的事件并检索,但如果是 9X,则继续寻找下一个非 9x 事件。

谢谢

标签: sqldb2

解决方案


您的问题是您在获取最新行后过滤掉了不需要的事件:

WHERE RN = 1  and ship_evnt_cd not like ('9%')

您需要先过滤,然后从剩下的行中获取最新的行:

LEFT JOIN (SELECT ship_id, ship_to_loc_cd856, ship_evnt_cd, 
                  updt_job_tms, carr_tracking_num, event_srv_lvl, 
                  ROW_NUMBER() OVER(PARTITION BY ship_id ORDER BY updt_job_tms DESC) AS rn
           FROM Shipment_Event
           -- This _might_ perform better than the NOT LIKE condition, you'll need to test
           WHERE LEFT(ship_evnt_cd, 1) <> '9') lscus
       ON lscus.ship_id = scus.ship_id 
          AND lscus.ship_to_loc_cd856 = scus.ship_to_loc_code 
          AND lscus.rn = 1

推荐阅读