PARENT_ID ID YR_MONTH REWARD
1 1 11 201601 3
2 1 12 201605 9
3 1 13 201609 12
4 2 21 201601 6
5 2 22 201605 9
6 2 23 201609 9
7 3 31 201601 15
8 3 32 201605 9
9 3 33 201609 12
10 3 34 201610 9
我需要创建一个基于奖励列的新列。奖励为9的情况下,条件为1否则为0。
条件将是:
对于特定的parent_id,id检查是否有比上一个yr_month高的奖励,如果是,则为0,否则为0,否则为1
只有前9个被标记为1,否则为0
预期成绩:
PARENT_ID ID YR_MONTH REWARD REWARD_STATUS
1 1 11 201601 3 0
2 1 12 201605 9 1
3 1 13 201609 12 0
4 2 21 201601 6 0
5 2 22 201605 9 1
6 2 23 201609 9 0
7 3 31 201601 15 0
8 3 32 201605 9 0
9 3 33 201609 12 0
10 3 34 201610 9 0
我将使用窗口函数:
select
t.*,
case
when reward = 9
and sum(case when reward >= 9 then 1 else 0 end) over(partition by parent_id order by yr_month) = 1
then 1 else 0 end reward_status
from mytable t
该case
表达式在以下情况下返回1
:
在reward
当前记录的已经是9
并没有对相同的“以前”的记录parent_id
,其reward
等于或大于9
如果您正在运行MySQL,则case
表达式可以简化为:
(
reward = 9
and sum(reward >= 9) over(partition by parent_id order by yr_month)
) reward_status
PARENT_ID | ID | YR_MONTH | 奖励| REWARD_STATUS --------:| -:| -------:| -----:| ------------: 1 | 11 | 201601 | 3 | 0 1 | 12 | 201605 | 9 | 1 1 | 13 | 201609 | 12 | 0 2 | 21 | 201601 | 6 | 0 2 | 22 | 201605 | 9 | 1 2 | 23 | 201609 | 9 | 0 3 | 31 | 201601 | 15 | 0 3 | 32 | 201605 | 9 | 0 3 | 33 | 201609 | 12 | 0 3 | 34 | 201610 | 9 | 0
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句