在PL/SQL中,如何根据下一行更新行?

Isa*_*ses 5 sql oracle ora-00934

我正在使用Oracle PL/SQL.

我有一个带时间戳的表T,我想将列A的行值设置为与前一行的值相同,如果它们按列B和时间戳排序,前提是时间戳的差别不大于45秒

在伪代码中,它是这样的:

UPDATE T t_curr
  SET A =
    (SELECT A
      FROM T t_prev
      INNER JOIN t_curr
        ON (t_prev is the row right before t_curr, when you sort by B and Timestamp)
          AND t_curr.Timestamp - t_prev.Timestamp < 45
    )
Run Code Online (Sandbox Code Playgroud)

我试过这个:

UPDATE T t_curr
  SET A =
    (SELECT A
      FROM T t_prev
      INNER JOIN t_curr
        ON RANK (t_curr)
          OVER (B, Timestamp)
          = 1 + RANK (t_prev)
          OVER (B, Timestmap)
          AND t_curr.Timestamp - t_prev.Timestamp < 45
    )
Run Code Online (Sandbox Code Playgroud)

但我得到了:

错误(38,16):PL/SQL:ORA-00934:此处不允许组功能

指着RANK的第一个实例.

我做错了什么,我怎么做到这一点?

Mik*_*ers 4

尝试使用合并语句。不确定它是否完全符合您的要求,但它应该有效。不幸的是,插入子句是必要的)但不应该被调用。

merge into t a
using (
  select 
    A, 
    B, 
    timestamp, 
    lag(A) over (order by id, timestamp) as prior_A,
    lag(timestamp) over (order by B, timestamp) as prior_timestamp
  from t) b
on  (a.B = b.B)
when matched then 
  update set a.a = case when b.timestamp-b.prior_timestamp <= 45 
    then b.prior_A else b.A end
when not matched then insert (B) values (null)
Run Code Online (Sandbox Code Playgroud)