Лучшее решение - это предложение Билла Карвина. Недавно мне пришлось решить эту проблему в относительно большом наборе результатов (1000 строк с 12 столбцами, каждый из которых нуждается в этом типе «покажите мне последнее ненулевое значение, если это значение равно нулю в текущей строке») и используя метод обновления с верхним 1 выберите предыдущее известное значение (или подзапрос с топ-1), выполняемое очень медленно.
Я использую SQL 2005, и синтаксис для замены переменной немного отличается от mysql:
UPDATE mytable
SET
@n = COALESCE(number, @n),
number = COALESCE(number, @n)
ORDER BY date
Первый оператор set обновляет значение переменной @n до значения текущей строки 'number', если 'number' не равно нулю (COALESCE возвращает первый ненулевой аргумент, который вы передаете ему)
Второй оператор set обновляет фактическое значение столбца для 'number' для себя (если оно не равно NULL) или переменной @n (которая всегда содержит последнее значение, отличное от NULL).
Прелесть этого подхода в том, что нет дополнительных затрат ресурсов на сканирование временной таблицы снова и снова ... Обновление @n в строке обеспечивает отслеживание последнего ненулевого значения.
У меня недостаточно представителей, чтобы голосовать за него, но кто-то должен. Это самый элегантный и лучший исполнитель.