Estoy usando Oracle PL/SQL.En PL/SQL, ¿cómo se actualiza una fila según la siguiente fila?
Tengo una tabla con sello de tiempo T, y quiero establecer el valor de una fila para que la columna A sea la misma que la de la fila anterior, si están ordenadas por columnas B y Timestamp, siempre que las marcas de tiempo no sean diferente por más de 45 segundos.
En pseudocódigo, que es algo así como:
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
)
He intentado esto:
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
)
Pero tengo:
error (38,16): PL/SQL: ORA-00934: la función de grupo no está permitida aquí
apuntando a la primera instancia de RANK.
¿Qué hice mal y cómo lo hago bien?
Estaba a punto de sugerir usar 'lag' o' lead', pero eso podría no funcionar tampoco ... o podría intentar 'update T set a = seleccionar Q1.A from ((seleccionar A, rownum r1 de T) Q1 left outer join (seleccione A, rownum r2 de T) Q2 en Q1.r1 = Q2.r2-1) ' – FrustratedWithFormsDesigner
@FrustratedWithFormsDesigner - Tiene razón en que el retraso y el plomo me dan el mismo problema. Sin embargo, tengo algo basado en tu otra sugerencia para compilar, ¡así que gracias! Si quieres copiarlo en una respuesta para que lo acepte, estaría bien. –
¡Hecho! (Publiqué como comentario al principio porque nunca he intentado esto para una actualización y no estaba seguro de que funcionaría);) – FrustratedWithFormsDesigner