Обновите пустые строки с предыдущими не пустыми строками - PullRequest
2 голосов
/ 13 июня 2019

У меня есть сценарий, в котором в моей таблице 2 столбца, а в одном столбце - ряд дат, а в другом - некоторые значения. Теперь мне нужно обновить нулевые значения до значения, соответствующего самой последней дате, как показано ниже.

enter image description here

Я не могу использовать функции LEAD и LAG, так как использую SQL Server 2008R2.

Пример данных приведен ниже.

DECLARE @Table TABLE
(
    Date_D DATE,
    Val INT
);

INSERT INTO @Table
(
    Date_D,
    Val
)
VALUES
('2019-06-15', 2),
('2019-06-16', NULL),
('2019-06-17', NULL),
('2019-06-18', 7),
('2019-06-19', 1),
('2019-06-20', 5),
('2019-06-21', NULL),
('2019-06-22', NULL),
('2019-06-23', NULL),
('2019-06-24', NULL),
('2019-06-25', 9),
('2019-06-26', 5),
('2019-06-27', 3),
('2019-06-28', 4),
('2019-06-29', NULL),
('2019-06-30', 1)



SELECT * FROM @Table

Ответы [ 3 ]

3 голосов
/ 13 июня 2019

Обновление с использованием коррелированного подзапроса:

UPDATE T0
SET Val = (
    SELECT TOP 1 Val
    FROM @Table As T1
    WHERE Val IS NOT NULL
    AND T0.Date_D > T1.Date_D
    ORDER BY Date_D DESC
    ) 
FROM @Table As T0
WHERE Val IS NULL

Проверка:

SELECT *
FROM @Table

Результаты:

Date_D          Val
15.06.2019      2
16.06.2019      2
17.06.2019      2
18.06.2019      7
19.06.2019      1
20.06.2019      5
21.06.2019      5
22.06.2019      5
23.06.2019      5
24.06.2019      5
25.06.2019      9
26.06.2019      5
27.06.2019      3
28.06.2019      4
29.06.2019      4
30.06.2019      1
0 голосов
/ 13 июня 2019

Вы можете сделать как

SELECT Date_D, CASE WHEN Val IS NULL THEN
          (
            SELECT TOP 1 Val 
            FROM @Table 
            WHERE Val IS NOT NULL AND Date_D < T.Date_D 
            ORDER BY Date_D DESC
          ) ELSE Val END
FROM @Table T;

Если вы хотите обновить таблицу, объедините ее с результатами.

Для UPDATE

;WITH CTE AS
(
  SELECT Date_D, CASE WHEN Val IS NULL THEN
            (
              SELECT TOP 1 Val 
              FROM @Table 
              WHERE Val IS NOT NULL AND Date_D < T.Date_D 
              ORDER BY Date_D DESC
            ) ELSE Val END Val
  FROM @Table T
)
UPDATE T
SET T.Val = CTE.Val
FROM @Table T INNER JOIN CTE
ON T.Date_D = CTE.Date_D
WHERE T.Val IS NULL; --You can also AND Date_D BETWEEN StartDate AND EndDate

Посмотрите, как это работает на живом демо

0 голосов
/ 13 июня 2019

Один из способов сделать это - выбрать дополнительный элемент, выбрав значение TOP 1, отличное от NULL, перед текущим Date_D.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...