Страницы

Поиск по вопросам

вторник, 10 декабря 2019 г.

Замена NULL на значение предыдущего значения

#sql #sql_server


Делаю такой запрос на t-sql:

SELECT *, 
CASE WHEN Sum_ IS NOT NULL THEN Sum_
ELSE COALESCE(Sum_, 0)
END AS first_Non_Null
FROM dbo.VIEW_1;
GO


Где идет обработка поля Sum_, если оно пустое, то заменяем его на 0, в противном
случае оставляем без изменения. У меня вопрос такой, можно сделать так, чтобы сделать
вставку не 0, а значения предыдущего числового значения.

Если, допустим, данный запрос вернет:

Index_data | Sum_
_____________________
20.10.2015 | 8
21.10.2015 | 2
22.10.2015 | NULL
23.10.2015 | 5
24.10.2015 | NULL
25.10.2015 | NULL
26.10.2015 | 6


Переделать его так:

Index_data | Sum_
_____________________
20.10.2015 | 8
21.10.2015 | 2
22.10.2015 | 2
23.10.2015 | 5
24.10.2015 | 5
25.10.2015 | 5
26.10.2015 | 6


Как это сделать? Хотел курсором перебрать, однако, хочется оформить это просто запросом
или вложенными запросами. 

SELECT *, 
CASE WHEN Sum_ IS NOT NULL THEN Sum_
ELSE COALESCE(Sum_, SELECT Sum_ FROM dbo.VIEW_1 WHERE ????)
END AS first_Non_Null
FROM dbo.VIEW_1;
GO


или как-то так:

DECLARE @val nvarchar(30); 
SELECT *, 
CASE WHEN Sum_ IS NOT NULL THEN Sum_
ELSE COALESCE(Sum_, Sum_.PREV....... )
END AS first_Non_Null
FROM dbo.VIEW_1;
GO


Такое возможно сделать?
    


Ответы

Ответ 1



Используйте функцию LAG: SELECT index_data, coalesce(Sum_, LAG(Sum_) OVER(ORDER BY index_data)) FROM dbo.VIEW_1;

Ответ 2



Можно попробовать сделать через "хитрый" JOIN. У тебя есть запрос, который возвращает значения с NULL и значения без NULL. Можно попробовать с чем-то типа этого поиграть : JOIN table2 ON DATEADD(d,1,table2.date)=table1.date and DATEADD(d,1,table2.date) is not null

Комментариев нет:

Отправить комментарий