itm wk f1 f2
i1 w1 0 0
i1 w2 0 0
i1 w3 0 0
i1 w4 0 0
i1 w5 0 0
i1 w6 1 0
i1 w7 1 0
i1 w8 1 0
i1 w9 1 0
i1 w10 1 0
i1 w11 1 0
i1 w12 0 1
i1 w15 0 1
i1 w16 0 0
i1 w17 0 0
i1 w18 0 0
----------
i2 w1 0 0
i2 w2 0 0
i2 w3 0 0
i2 w4 0 0
i2 w5 0 0
i2 w6 0 0
i2 w7 0 0
i2 w8 0 0
i2 w9 1 0
i2 w10 1 0
i2 w11 1 0
i2 w12 1 0
i2 w13 0 1
i2 w14 0 1
i2 w16 0 1
i2 w17 0 0
i2 w18 0 0
----------
i3 w1 0 0
i3 w2 0 0
i3 w3 0 0
i3 w4 0 0
i3 w5 0 0
i3 w6 0 0
i3 w7 0 0
i3 w8 0 0
i3 w9 1 0
i3 w10 1 0
i3 w11 0 1
i3 w12 0 1
i3 w13 0 1
i3 w14 0 1
i3 w15 0 0
i3 w16 0 0
i3 w17 0 0
i3 w18 0 0
----------
上表包含第1周到第18周(w1到w18)的三个项目(i1,i2和i3)以及相应项目和周的标志f1(0或1)的数据。注意:可能有几周数据不存在,例如" i1"没有w13和w14的数据,类似地" i2"没有w15和" i3"的数据有每周的数据。
现在我想创建另一个标志f2,标志为1,用于下一个四周,其中" f1"最后一次是1
例如:for item" i3" f1最后被标记为w10周,现在f2将被标记为接下来的四周,即w11,w12,w13和w14周
对于项目" i1" f1最后一周被标记为w11,现在f2将被标记为接下来的四周,即w12,w13,w14和w15 周周w13和w14不存在因此f2将被标记仅适用于w12和w15
对于项目" i2" f1最后一周被标记为w12,现在f2将被标记为接下来的四周,即w13,w14,w15和w16 ,但周w15不存在,因此f2将仅标记为f2 w13,w14和w16
请帮助编写teradata中的上述示例
答案 0 :(得分:0)
首先,您需要找到每个项目的最后f1
:
select itm, max(wk)
from table t
where f1 = 1
group by itm;
接下来,您可以使用此信息来定义标记:
select t.itm, t.wk, t.f1,
(case when t.wk between tf1.maxwk + 1 and tf1.maxwk + 4 then 1 else 0 end) as f2
from table t left join
(select itm, max(wk) as maxwk
from table t
where f1 = 1
group by itm
) tf1
on t.itm = tf1.itm;
你可以用窗函数实际做到这一点,虽然我认为上面的内容可能更清楚:
select t.itm, t.wk, t.f1,
(case when max(case when f1 = 1 then wk end) over (partition by itm) between wk - 4 and wk - 1
then 1 else 0
end) as f2
from table t;
答案 1 :(得分:0)
假设您需要使用MAX多次分配此标志是不够的,您需要应用累积最大值:
case
when max(case when f1 = 1 then wk end) -- last week where flag was set
over (partition by itm
order by wk
rows unbounded preceding) >= wk - 4 -- must be not more than 4 weeks ago
and f1 = 0 -- flag not set on the current row
then 1
else 0
end