sql - 需要检索表的最后插入/更新的记录并排除一些例外
问题描述
我正在尝试检索表 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 事件。
谢谢
解决方案
您的问题是您在获取最新行后过滤掉了不需要的事件:
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
推荐阅读
- javascript - wxPython中的网络浏览器可以使用javascript进行python函数调用吗?
- python - django-login-required 中间件给出类型错误
- angular - 使用异步管道显示从应用程序状态检索到的 Observable 数据
- php - PHP:递归地将parant子添加到多维数组
- javascript - REACTJS:如何知道 Promise 中的方法是否失败?
- rust - Rust 中的生命周期如何为函数工作?
- error-handling - 如何访问用户在命令中传递的内容以将其用作命令错误处理程序?不和谐.py
- angular - 如何在弹簧靴中使用角度束
- c - C 错误:int 之前的预期表达式(当我调用该函数时,我得到一个表达式丢失的错误)
- json - 通过删除 Python 修改 JSON 字典