【问题标题】:sql:want to flag a column based on other column value and some conditionsql:想要根据其他列值和某些条件标记列
【发布时间】:2015-12-24 18:29:10
【问题描述】:
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
----------

上表包含第一周到第十八周(w1 到 w18)的三个项目(i1、i2 和 i3)的数据以及相应项目和周的标志 f1(0 或 1)。注意:可能有几周数据不存在,例如“i1”没有 w13 和 w14 的数据,同样“i2”没有 w15 的数据,“i3”有每周的数据。

现在我想创建另一个标志 f2,它在接下来的 4 周 标记为 1,从最后一次创建“f1”的点 1

例如:对于项目“i3”,f1 上次被标记为第 w10 周,现在 f2 将被标记为下一个 4 周,即第 w11、w12、w13 和 w14 周

对于项目“i1”,f1 上次被标记为 w11 周,现在 f2 将被标记为接下来的 4 周,即 w12、w13、w14 和 w15 周 但是 w13 和 w14 周不存在,因此 f2 将被标记为仅 w12 和 w15

对于项目“i2”,f1 上次被标记为第 w12 周,现在 f2 将被标记为接下来的 4 周,即第 w13、w14、w15 和 w16 周 第 w15 周不是存在,因此 f2 将仅被标记为 w13、w14 和 w16

请帮助在 teradata 中对上述示例进行编码

【问题讨论】:

  • wk 的数据类型是什么,实际上是varchar(格式总是相同的w..?)或date
  • wk的数据类型是整数

标签: sql teradata


【解决方案1】:

假设您需要使用 MAX 多次分配此标志是不够的,您需要应用 Cumulative 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

【讨论】:

    【解决方案2】:

    首先,您需要找到每个项目的最后一个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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-14
      • 1970-01-01
      • 1970-01-01
      • 2022-01-22
      • 2020-09-17
      • 2016-09-17
      • 2020-01-04
      • 1970-01-01
      相关资源
      最近更新 更多