获取以前的结果并添加到行
Take previous results and add to row
我有以下 table 结果。
条件:
按 CUSTID 和 ITEMID 分区
其中 end_dt 不为空
如果 RESP 列为空,则采用具有条目的最新值。
CUSTID ITEMID START_DT END_DT RESP START_CYCLE END_CYCLE
1 101 1/1/2019 4/1/2019 400 1/1/2019 1/12/2019
1 101 1/1/2019 4/1/2019 1/13/2019 1/18/2019
1 101 1/1/2019 4/1/2019 750 1/19/2019 2/15/2019
1 101 1/1/2019 4/1/2019 2/16/2019 4/1/2019
2 909 3/1/2019 444 3/1/2019 3/2/2019
2 909 3/1/2019 3/3/2019 3/10/2019
2 909 3/1/2019 767 3/11/2019 3/28/2019
2 909 3/1/2019 3/29/2019 12/31/3000
预期结果:
CUSTID ITEMID START_DT END_DT RESP START_CYCLE END_CYCLE
1 101 1/1/2019 4/1/2019 400 1/1/2019 1/12/2019
1 101 1/1/2019 4/1/2019 1/13/2019 1/18/2019
1 101 1/1/2019 4/1/2019 750 1/19/2019 2/15/2019
1 101 1/1/2019 4/1/2019 750 2/16/2019 4/1/2019
2 909 3/1/2019 444 3/1/2019 3/2/2019
2 909 3/1/2019 3/3/2019 3/10/2019
2 909 3/1/2019 767 3/11/2019 3/28/2019
2 909 3/1/2019 3/29/2019 12/31/3000
唯一发生变化的行是
1 101 1/1/2019 4/1/2019 750 2/16/2019 4/1/2019
这一行不应该改变,这是正确的:
1 101 1/1/2019 4/1/2019 1/13/2019 1/18/2019
您必须检查三件事:resp 是否为 null,end_dt 是否为 null,如果这是该 custid 的最后一行,itemid。仅在这种情况下使用 last_value,如此处,列 resp2
:
select custid, itemid, start_dt, end_dt, resp, start_cycle, end_cycle,
case when resp is null
and end_dt is not null
and lead(itemid) over (partition by custid, itemid order by start_cycle) is null
then last_value(resp) ignore nulls
over (partition by custid, itemid order by start_cycle)
else resp
end resp2
from t
我有以下 table 结果。
条件:
按 CUSTID 和 ITEMID 分区 其中 end_dt 不为空 如果 RESP 列为空,则采用具有条目的最新值。
CUSTID ITEMID START_DT END_DT RESP START_CYCLE END_CYCLE
1 101 1/1/2019 4/1/2019 400 1/1/2019 1/12/2019
1 101 1/1/2019 4/1/2019 1/13/2019 1/18/2019
1 101 1/1/2019 4/1/2019 750 1/19/2019 2/15/2019
1 101 1/1/2019 4/1/2019 2/16/2019 4/1/2019
2 909 3/1/2019 444 3/1/2019 3/2/2019
2 909 3/1/2019 3/3/2019 3/10/2019
2 909 3/1/2019 767 3/11/2019 3/28/2019
2 909 3/1/2019 3/29/2019 12/31/3000
预期结果:
CUSTID ITEMID START_DT END_DT RESP START_CYCLE END_CYCLE
1 101 1/1/2019 4/1/2019 400 1/1/2019 1/12/2019
1 101 1/1/2019 4/1/2019 1/13/2019 1/18/2019
1 101 1/1/2019 4/1/2019 750 1/19/2019 2/15/2019
1 101 1/1/2019 4/1/2019 750 2/16/2019 4/1/2019
2 909 3/1/2019 444 3/1/2019 3/2/2019
2 909 3/1/2019 3/3/2019 3/10/2019
2 909 3/1/2019 767 3/11/2019 3/28/2019
2 909 3/1/2019 3/29/2019 12/31/3000
唯一发生变化的行是
1 101 1/1/2019 4/1/2019 750 2/16/2019 4/1/2019
这一行不应该改变,这是正确的:
1 101 1/1/2019 4/1/2019 1/13/2019 1/18/2019
您必须检查三件事:resp 是否为 null,end_dt 是否为 null,如果这是该 custid 的最后一行,itemid。仅在这种情况下使用 last_value,如此处,列 resp2
:
select custid, itemid, start_dt, end_dt, resp, start_cycle, end_cycle,
case when resp is null
and end_dt is not null
and lead(itemid) over (partition by custid, itemid order by start_cycle) is null
then last_value(resp) ignore nulls
over (partition by custid, itemid order by start_cycle)
else resp
end resp2
from t