Смотрите здесь . Должен быть:
yourcommand &>filename
(перенаправляет и stdout
и stderr
к имени файла).
Если вы используете Sql Сервер, это должно работать
DECLARE @Table TABLE(
ID INT,
Val INT
)
INSERT INTO @Table (ID,Val) SELECT 1, 3
INSERT INTO @Table (ID,Val) SELECT 2, NULL
INSERT INTO @Table (ID,Val) SELECT 3, 5
INSERT INTO @Table (ID,Val) SELECT 4, NULL
INSERT INTO @Table (ID,Val) SELECT 5, NULL
INSERT INTO @Table (ID,Val) SELECT 6, 2
SELECT *,
ISNULL(Val, (SELECT TOP 1 Val FROM @Table WHERE ID < t.ID AND Val IS NOT NULL ORDER BY ID DESC))
FROM @Table t
Вот решение MySQL:
UPDATE mytable
SET number = (@n := COALESCE(number, @n))
ORDER BY date;
Это кратко, но не обязательно будет работать в СУБД других производителей. Для других брендов может быть более подходящее решение для конкретной марки. Вот почему так важно сообщить нам, какой бренд вы используете.
Приятно быть независимым от поставщика, как прокомментировал @Pax, но в противном случае также приятно использовать выбранную вами марку базы данных в полной мере.
Объяснение приведенного выше запроса:
@n
- пользовательская переменная MySQL. Он начинается с NULL, и ему присваивается значение в каждой строке, когда UPDATE проходит по строкам. Если число
не равно NULL, @n
присваивается значение число
. Где число
равно NULL, для COALESCE ()
по умолчанию используется предыдущее значение @n
. В любом случае это становится новым значением столбца число
, и ОБНОВЛЕНИЕ переходит к следующей строке. Переменная @n
сохраняет свое значение от строки к строке, поэтому последующие строки получают значения, полученные из предыдущей строки (строк). Порядок UPDATE предсказуем, поскольку MySQL специально использует ORDER BY с UPDATE (это не стандартный SQL).
Вот решение Oracle (10g или выше). Он использует аналитическую функцию last_value ()
с опцией игнорировать нули
, которая заменяет последнее ненулевое значение для столбца.
SQL> select *
2 from mytable
3 order by id
4 /
ID SOMECOL
---------- ----------
1 3
2
3 5
4
5
6 2
6 rows selected.
SQL> select id
2 , last_value(somecol ignore nulls) over (order by id) somecol
3 from mytable
4 /
ID SOMECOL
---------- ----------
1 3
2 3
3 5
4 5
5 5
6 2
6 rows selected.
SQL>
В очень общем смысле:
UPDATE MyTable
SET MyNullValue = MyDate
WHERE MyNullValue IS NULL
Прежде всего, действительно ли вам нужно сохранять значения? Вы можете просто использовать представление, которое выполняет эту работу:
SELECT t."date",
x."number" AS "number"
FROM @Table t
JOIN @Table x
ON x."date" = (SELECT TOP 1 z."date"
FROM @Table z
WHERE z."date" <= t."date"
AND z."number" IS NOT NULL
ORDER BY z."date" DESC)
Если у вас действительно есть столбец ID («дата»)
и это первичный ключ (сгруппированный), то этот запрос должен быть довольно быстрым. . Но проверьте план запроса: может быть лучше иметь индекс покрытия, включающий также столбец Val
.
Также, если вам не нравятся процедуры, когда их можно избежать, вы также можете использовать аналогичный запрос для ОБНОВЛЕНИЕ
:
UPDATE t
SET t."number" = x."number"
FROM @Table t
JOIN @Table x
ON x."date" = (SELECT TOP 1 z."date"
FROM @Table z
WHERE z."date" < t."date" --//@note: < and not <= here, as = not required
AND z."number" IS NOT NULL
ORDER BY z."date" DESC)
WHERE t."number" IS NULL
ПРИМЕЧАНИЕ: код должен работать на «SQL Server».
UPDATE TABLE
SET number = (SELECT MAX(t.number)
FROM TABLE t
WHERE t.number IS NOT NULL
AND t.date < date)
WHERE number IS NULL