2015-09-27 53 views
0
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 
---------- 

上表具有用於三個項目(I1,I2和I3)一個星期到18的數據(W1至W18)和標誌F1( 0或1)。注意:可能有幾週數據不存在,例如「i1」沒有w13和w14的數據,同樣「i2」沒有w15和「i3」的數據「每週都有數據。SQL:要標記的列基於其他列值和一些條件

現在我想創建另一個標誌F2在那裏下一個4周從那裏「F1」是上一次進行1

例如點標記1:項目「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將被標記爲只W13,W14和W16

請編碼的Teradata上面的例子

+0

什麼wk'的'數據類型,實際上是一個'varchar'(總是相同的格式'w..'?)或'date'。 – dnoeth

+0

wk的數據類型是整數 –

回答

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; 
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