gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 01:43:29 24 4
gpt4 key购买 nike

我正在使用 Oracle PL/SQL。

我有一个带时间戳的表 T,如果按 B 列和时间戳排序,并且时间戳不不同,我想将 A 列的行值设置为与前一行的值相同超过 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
)

我尝试过这个:

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
)

但是我得到了:

Error(38,16): PL/SQL: ORA-00934: group function is not allowed here

指向 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)

关于sql - 在 PL/SQL 中,如何根据下一行更新一行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4156058/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com