首页 > 解决方案 > Oracle SQL 返回第一个差异

问题描述

我有以下数据表

源数据

并希望在 Oracle 中使用 SQL 生成结果表:

在此处输入图像描述

我尝试使用“LAG”,但它没有按预期工作。提前致谢。

标签: sqloracle

解决方案


横向连接可能是最简单的解决方案:

select t.*,
       t2.date as lastchangedate,
       t2.value as lastvalue
from t left join lateral
     (select t2.*
      from t t2
      where t2.date < t.date and
            t2.value <> t.value
      order by t2.date desc
      fetch first row only
     ) t2
     on 1=1;

另一种方法使用窗口函数。一种方法是用于lag()确定值何时更改,然后将其传播到行组中:

select t.*,
       last_value(case when prev_value <> value then prev_value end ignore nulls) over (order by date)
from (select t.*,
             lag(value) over (order by date) as prev_value
      from t
     ) t;

是一个 db<>fiddle。


推荐阅读