sql:想根据其他列值和某些条件标记列

时间:2015-09-27 11:15:05

标签: sql teradata

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中的上述示例

2 个答案:

答案 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