Aquí hay una solución MySQL:
UPDATE mytable
SET number = (@n := COALESCE(number, @n))
ORDER BY date;
Este es conciso, pero no será necesario trabajar en otras marcas de RDBMS. Para otras marcas, puede haber una solución específica de la marca que sea más relevante. Es por eso que es importante que nos diga la marca que está usando.
Es bueno ser independiente del proveedor, como comentó @Pax, pero en su defecto, también es bueno utilizar la base de datos de su marca elegida para su máxima ventaja.
Explicación de la consulta anterior:
@n
es una variable de usuario MySQL. Comienza NULL y se le asigna un valor en cada fila a medida que la ACTUALIZACIÓN se ejecuta en las filas. Donde number
no es NULL, @n
tiene asignado el valor number
. Donde number
es NULO, el COALESCE()
se predetermina al valor anterior de @n
. En cualquier caso, este se convierte en el nuevo valor de la columna number
y la ACTUALIZACIÓN avanza a la siguiente fila. La variable @n
conserva su valor de una fila a otra, por lo que las filas subsiguientes obtienen valores que provienen de la (s) fila (s) anterior (es). El orden de la ACTUALIZACIÓN es predecible, debido al uso especial de MySQL de ORDER BY con UPDATE (esto no es SQL estándar).
¿Puede identificar la marca de la base de datos SQL que está utilizando, p. MySQL, Oracle, SQL-Server, y edite su pregunta para agregar esa etiqueta? –
¿Quiere decir la fecha en una fila anterior o la fecha anterior (día -1)? Quizás proporcione un ejemplo de los datos que tiene en las columnas y un ejemplo del resultado que desea. – Degan
@ Bill, es posible que desee una solución genérica. A algunos de nosotros * les gusta * la capacidad de cambiar fácilmente entre DBMS 'cuando se convierten en PITA :-) Aún así, es muy difícil (quizás imposible) hacer esto en SQL estándar, @mike, así que si tienes un DBMS específico en mente, de todos modos avísanos. – paxdiablo