说我有这些数据:
status | source | communication
-------------------|----------------
start | 1 | 1
changed | 2 | 1
changed | 2 | 1
changed | 2 | 1
end | 1 | 1
我知道我可以在通信列上使用滞后函数分区,并通过时间戳列(此处未显示)进行排序以获取前一个源。
但是,我如何在保留所有行的同时获取status is not 'Changed'
的前一个来源?像这样:
status | source | communication | prev_source
-------------------|----------------|-----------
start | 1 | 1 | null
changed | 2 | 1 | 1
changed | 2 | 1 | 1
changed | 2 | 1 | 1
end | 1 | 1 | 1
答案 0 :(得分:2)
您可以使用ignore nulls
:
select t.*,
lag(case when status <> 'changed' then source end ignore nulls) over
(order by ??) as prev_source
from t;
您还需要一个列来指定行的顺序。这就是??
的用途。