sql Server不支持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
子查询执行的窗口总和每次发现非null值时都会递增:这定义了包含非null值后跟null值的行组。
然后,外部使用窗口max()
检索每个组中的(仅)非null值。
假设可以使用一列对记录进行 排序 (我称之为id
)。
:
ID | PAST_DUE_COL | grp | new_past_due_col
-: | :---------------------- | --: | :----------------------
1 | 91 or more days pastdue | 1 | 91 or more days pastdue
2 | null | 1 | 91 or more days pastdue
3 | null | 1 | 91 or more days pastdue
4 | 61-90 days past due | 2 | 61-90 days past due
5 | null | 2 | 61-90 days past due
6 | null | 2 | 61-90 days past due
7 | 31-60 days past due | 3 | 31-60 days past due
8 | null | 3 | 31-60 days past due
9 | 0-30 days past due | 4 | 0-30 days past due
10 | null | 4 | 0-30 days past due
11 | null | 4 | 0-30 days past due
12 | null | 4 | 0-30 days past due