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

Oracle从审计表获取字段变更新旧值的SQL查询方法

解决方案:用Oracle窗口函数LAG()实现变更前后值对比

这个需求很典型,用Oracle自带的窗口函数LAG()就能轻松搞定!

核心思路

你的审计表记录了每一次值变更的历史,我们只需要为每条记录找到它的上一条记录的VALUE(也就是变更前的旧值),当前记录的VALUE自然就是变更后的新值,而当前记录的CHANGED_DATE就是这次变更发生的时间。最后过滤掉没有旧值的第一条初始记录即可。

实现SQL

SELECT
  LAG(VALUE) OVER (ORDER BY CHANGED_DATE) AS OLD_VALUE,
  VALUE AS NEW_VALUE,
  CHANGED_DATE
FROM
  你的审计表名
WHERE
  LAG(VALUE) OVER (ORDER BY CHANGED_DATE) IS NOT NULL;

代码细节说明

  1. LAG(VALUE) OVER (ORDER BY CHANGED_DATE):这个函数会按照CHANGED_DATE的时间顺序,为每条记录获取它前一条记录的VALUE值,作为OLD_VALUE。这里用时间排序比用OID更稳妥,能避免OID和实际变更时间顺序不一致的情况;如果你的OID是严格按变更时间递增生成的,换成ORDER BY OID也完全可行。
  2. WHERE子句:过滤掉OLD_VALUE为空的记录——也就是最开始的那条初始值记录,它没有之前的变更,所以不需要出现在结果里。

验证示例数据

把你提供的示例数据代入这个SQL,会直接输出你期望的结果:

OLD_VALUE|NEW_VALUE|CHANGED_DATE
--------------------------------
ABC      |DEF      |22-JUN-18
DEF      |XYZ      |16-JUL-18

内容的提问来源于stack exchange,提问作者cloudwalker

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 10:00:29