我正在使用Oracle PL/SQL。在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
)
我嘗試這樣做:
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
)
但我得到:
指向RANK的第一個實例的錯誤(38,16):PL/SQL: ORA-00934:此處不允許使用組功能
。
我做錯了什麼,以及我如何得到這個權利?
我正要建議使用'lag'或'lead',但這可能無法工作......或者您可以嘗試更新T set a =從Q中選擇Q1.A((從T中選擇A,rownum r1) Q1離開外部連接(從T中選擇A,rownum r2)Q1.r1 = Q2.r2-1)' – FrustratedWithFormsDesigner 2010-11-11 15:33:22
@FrustratedWithFormsDesigner - 你說得對,滯後和導致同樣的問題。儘管如此,我根據您的其他建議編譯了某些內容,非常感謝!如果你想把它複製到我接受的答案中,那就沒問題。 – 2010-11-11 15:46:13
完成! (我起初發表評論,因爲我從來沒有嘗試過這個更新,並不知道它會工作);) – FrustratedWithFormsDesigner 2010-11-11 15:53:39