SQL Сервер не поддерживает опцию ignore nulls
для оконных функций, таких как lead()
и lag()
, для которых этот вопрос хорошо подошел.
Мы можем обойти это с некоторыми техника пробелов и островков:
select
t.*,
max(past_due_col) over(partition by grp) new_past_due_col
from (
select
t.*,
sum(case when past_due_col is null then 0 else 1 end)
over(order by id) grp
from mytable t
) t
Подзапрос создает сумму окна, которая увеличивается каждый раз, когда обнаруживается ненулевое значение: это определяет группы строк, которые содержат ненулевое значение, за которым следуют нулевые значения.
Затем внешний использует окно max()
для извлечения (только) ненулевого значения в каждой группе.
Это предполагает, что столбец можно использовать для порядка записи (я назвал это id
).
Демонстрация на DB Fiddle :
ID | PAST_DUE_COL | grp | new_past_due_col
-: | :---------------------- | --: | :----------------------
1 | 91 or more days pastdue | 1 | 91 or more days pastdue
2 | <em>null</em> | 1 | 91 or more days pastdue
3 | <em>null</em> | 1 | 91 or more days pastdue
4 | 61-90 days past due | 2 | 61-90 days past due
5 | <em>null</em> | 2 | 61-90 days past due
6 | <em>null</em> | 2 | 61-90 days past due
7 | 31-60 days past due | 3 | 31-60 days past due
8 | <em>null</em> | 3 | 31-60 days past due
9 | 0-30 days past due | 4 | 0-30 days past due
10 | <em>null</em> | 4 | 0-30 days past due
11 | <em>null</em> | 4 | 0-30 days past due
12 | <em>null</em> | 4 | 0-30 days past due