Voici une solution MySQL:
UPDATE mytable
SET number = (@n := COALESCE(number, @n))
ORDER BY date;
C'est concis, mais ne fonctionnera pas nécessairement dans d'autres marques de SGBDR. Pour les autres marques, il pourrait y avoir une solution spécifique à la marque qui soit plus pertinente. C'est pourquoi il est important de nous indiquer la marque que vous utilisez.
Il est bon d'être indépendant du fournisseur, comme l'a commenté @Pax, mais à défaut, il est également agréable d'utiliser votre marque de base de données à son avantage.
Explication de la requête ci-dessus:
@n
est une variable d'utilisateur MySQL. Il commence par NULL et se voit attribuer une valeur sur chaque ligne lorsque UPDATE parcourt les lignes. Lorsque number
est non nul, @n
reçoit la valeur number
. Lorsque number
est NULL, le COALESCE()
utilise par défaut la valeur précédente de @n
. Dans les deux cas, cela devient la nouvelle valeur de la colonne number
et le UPDATE passe à la ligne suivante. La variable @n
conserve sa valeur de ligne en ligne, de sorte que les lignes suivantes obtiennent des valeurs provenant de la ou des lignes précédentes. L'ordre de UPDATE est prévisible, en raison de l'utilisation spéciale de MySQL par ORDER BY avec UPDATE (ce n'est pas un SQL standard).
Pouvez-vous identifier la marque de base de données SQL que vous utilisez, par ex. MySQL, Oracle, SQL-Server, et éditez votre question pour ajouter cette balise? –
Voulez-vous dire la date dans une rangée précédente, ou la date précédente (jour -1)? Peut-être donner un exemple des données que vous avez dans les colonnes et un exemple de la sortie que vous désirez. – Degan
@ Bill, il peut vouloir une solution générique. Certains d'entre nous * aiment * la possibilité de passer facilement d'un SGBD à l'autre quand ils deviennent un PITA :-) Cependant, il est très difficile (voire impossible) de le faire en SQL standard, @mike, donc si vous avez un SGBD spécifique l'esprit, par tous les moyens laissez-nous savoir. – paxdiablo