CTE для последнего ненулевого значения - PullRequest
1 голос
/ 25 февраля 2020

У меня есть таблица:

key  dat        value
KEY1 01.07.2019 3
KEY2 01.07.2019 null
KEY1 01.08.2019 null
KEY2 01.08.2019 4
KEY1 01.09.2019 null
KEY2 01.09.2019 5

Мне нужно, чтобы значение имело последнее ненулевое значение, если в текущем месяце нет значения, в результате чего

key  dat        value
KEY1 01.07.2019 3
KEY2 01.07.2019 null
KEY1 01.08.2019 3 <=
KEY2 01.08.2019 4
KEY1 01.09.2019 3 <=
KEY2 01.09.2019 5

Я мог бы сделать это с помощью курсора, но я считаю, что правильный путь был бы go с CTE.

1 Ответ

4 голосов
/ 25 февраля 2020

«Правильный» путь - lag(ignore nulls), но SQL Сервер пока не реализует это.

Если значения постоянно растут, вы можете использовать совокупный максимум:

select t.*,
       max(value) over (partition by key order by date) as new_value
from t;

Это особый случай, остальная часть ответа дает более общие ответы.

Другой метод использует outer apply:

select t.*, t2.value
from t outer apply
     (select top (1) t2.*
      from t t2
      where t2.key = t.key and t2.date <= t.date and t2.value is not null
      order by t2.date desc
     ) t2

А третий метод использует два уровня окна функции:

select t.*, max(value) over (partition by key, not_null_date)
from (select t.*,
             max(case when value is not null then date end) over (partition by key order by date) as not_null_date
      from t
     ) t
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...