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的第一个实例.
我做错了什么,我怎么做到这一点?
尝试使用合并语句。不确定它是否完全符合您的要求,但它应该有效。不幸的是,插入子句是必要的)但不应该被调用。
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)