Нулевое значение замены SQL-ЗАПРОСА подряд со значением от предыдущего известного значения

Смотрите здесь . Должен быть:

yourcommand &>filename

(перенаправляет и stdout и stderr к имени файла).

24
задан Bill Karwin 28 August 2009 в 05:58
поделиться

6 ответов

Если вы используете 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
21
ответ дан 28 November 2019 в 22:36
поделиться

Вот решение 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).

16
ответ дан 28 November 2019 в 22:36
поделиться

Вот решение 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>
8
ответ дан 28 November 2019 в 22:36
поделиться

В очень общем смысле:

UPDATE MyTable
SET MyNullValue = MyDate
WHERE MyNullValue IS NULL
1
ответ дан 28 November 2019 в 22:36
поделиться

Прежде всего, действительно ли вам нужно сохранять значения? Вы можете просто использовать представление, которое выполняет эту работу:

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».

1
ответ дан 28 November 2019 в 22:36
поделиться
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
0
ответ дан 28 November 2019 в 22:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: