Używam Oracle PL/SQL.W języku PL/SQL, jak zaktualizować wiersz na podstawie następnego wiersza?
Mam tabelę T z sygnaturą czasową i chcę ustawić wartość wiersza dla kolumny A na taką samą, jak w poprzednim wierszu, jeśli są sortowane według kolumn B i datownika, o ile znaczniki czasu nie są różni się o więcej niż 45 sekund.
W Pseudokod, to coś jak:
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
)
Próbowałem to:
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
)
Ale mam:
Error (38,16): PL/SQL: ORA-00934: funkcja grupowa jest tutaj niedozwolona
wskazuje na pierwszą instancję RANKU.
Co zrobiłem źle i jak mam to naprawić?
Chciałem zasugerować użycie 'lag' lub' lead', ale to też może nie działać ... lub możesz spróbować 'update T set a = wybierz Q1.A z ((wybierz A, rownum r1 z T) Q1 opuścił zewnętrzne sprzężenie (wybierz A, rownum r2 z T) Q2 na Q1.r1 = Q2.r2-1) ' – FrustratedWithFormsDesigner
@FrustratedWithFormsDesigner - Masz rację, że opóźnienie i lead sprawiają, że mam ten sam problem. Mam coś na podstawie twoich innych sugestii do kompilacji, więc, dzięki! Jeśli chcesz go skopiować na odpowiedź, którą zaakceptuję, nic by się nie stało. –
Zrobione! (Na początku napisałem jako komentarz, ponieważ nigdy nie próbowałem tego dla aktualizacji i nie byłem pewien, czy to zadziała);) – FrustratedWithFormsDesigner