Ecco una soluzione MySQL:
UPDATE mytable
SET number = (@n := COALESCE(number, @n))
ORDER BY date;
Questo è conciso, ma non sarà necessario lavorare in altre marche di RDBMS. Per altri marchi, potrebbe esserci una soluzione specifica per il marchio che è più rilevante. Ecco perché è importante dirci il marchio che stai utilizzando.
È bello essere indipendenti dal fornitore, come ha commentato @Pax, ma in caso contrario, è anche bello utilizzare il database del database prescelto al massimo vantaggio.
Spiegazione della query precedente:
@n
è una variabile utente MySQL. Inizia NULL e viene assegnato un valore su ogni riga mentre UPDATE scorre attraverso le righe. Dove number
non è NULL, @n
viene assegnato il valore di number
. Dove number
è NULL, il valore COALESCE()
corrisponde al valore precedente di @n
. In entrambi i casi, questo diventa il nuovo valore della colonna number
e UPDATE passa alla riga successiva. La variabile @n
mantiene il suo valore da riga a riga, quindi le righe successive ottengono i valori che provengono dalle righe precedenti. L'ordine di UPDATE è prevedibile, a causa dell'uso speciale di ORDER BY da parte di MySQL con UPDATE (non è SQL standard).
fonte
2009-08-28 06:01:04
Puoi identificare la marca del database SQL che stai utilizzando, ad es. MySQL, Oracle, SQL-Server e modifica la tua domanda per aggiungere quel tag? –
Intendi la data in una riga precedente o la data precedente (giorno -1)? Puoi dare un esempio dei dati che hai nelle colonne e un esempio dell'output che desideri. – Degan
@Bill, potrebbe volere una soluzione generica. Alcuni di noi in realtà * gradiscono * la possibilità di passare facilmente tra DBMS 'quando diventano PITA :-) Tuttavia, è molto difficile (forse impossibile) farlo in SQL standard, @ mike, quindi se si ha un DBMS specifico in mente, con ogni mezzo facci sapere. – paxdiablo