将条件应用于红移中的窗口功能

时间:2017-09-07 13:03:49

标签: sql amazon-redshift

说我有这些数据:

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

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;

您还需要一个列来指定行的顺序。这就是??的用途。