Sto usando Oracle PL/SQL.In PL/SQL, come aggiorni una riga in base alla riga successiva?
Ho una tabella con data e ora T, e voglio impostare il valore di una riga per la colonna A per essere uguale a quello della riga precedente, se sono ordinati per le colonne B e Timestamp, a condizione che i timestamp non siano diverso da più di 45 secondi.
In pseudocodice, è qualcosa di simile:
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
)
ho provato questo:
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
)
Ma ho ottenuto:
errore (38,16): PL/SQL: ORA-00934: la funzione di gruppo non è consentita qui
puntato alla prima istanza di RANK.
Cosa ho fatto di sbagliato e come ottengo questo?
Stavo per suggerire di usare 'lag' o' lead' ma potrebbe non funzionare neanche ... o potresti provare 'update T set a = seleziona Q1.A da ((seleziona A, rownum r1 da T) Q1 left outer join (selezionare A, rownum r2 da T) Q2 su Q1.r1 = Q2.r2-1) ' – FrustratedWithFormsDesigner
@FrustratedWithFormsDesigner - Hai ragione che lag e lead mi fanno lo stesso problema. Ho ottenuto qualcosa in base al tuo altro suggerimento da compilare, però, quindi grazie! Se vuoi copiarlo in una risposta per accettarlo, andrebbe bene. –
Fatto! (Ho postato come commento all'inizio perché non ho mai provato questo per un aggiornamento e non ero sicuro che avrebbe funzionato);) – FrustratedWithFormsDesigner