根据sql中的条件创建新列?
Posted
技术标签:
【中文标题】根据sql中的条件创建新列?【英文标题】:Create new column based on condition in sql? 【发布时间】:2020-04-08 12:30:35 【问题描述】: PARENT_ID ID YR_MONTH REWARD
1 1 11 201601 3
2 1 11 201605 9
3 1 13 201609 9
4 2 21 201601 6
5 2 21 201605 15
6 2 21 201609 9
7 3 31 201601 8
8 3 31 201605 9
9 3 32 201609 9
10 3 32 201610 9
我需要创建一个基于奖励列的新列。 其中 Reward 是 9 put 1 else 0 根据条件。
条件是:
对于特定的 parent_id,id 检查上一年的奖励是否高于 9,如果是,则为 0,否则为 1
只有前 9 个将被标记为 1,否则为 0
预期结果:
PARENT_ID ID YR_MONTH REWARD REWARD_STATUS
1 1 11 201601 3 0
2 1 11 201605 9 1
3 1 13 201609 9 1
4 2 21 201601 6 0
5 2 21 201605 15 0
6 2 21 201609 9 0
7 3 31 201601 8 0
8 3 31 201605 9 1
9 3 32 201609 9 1
10 3 32 201610 9 0
【问题讨论】:
你有mysql和oracle标签,你用的是哪个RDBMS? 【参考方案1】:我会使用窗口函数:
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) = 1
) reward_status
Demo on DB Fiddle:
父 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【讨论】:
我已经更新了这个问题,你可以看看它。 @Mohekar:只需将partition by parent_id
更改为 partition by id
。
但是当一个特定的 id 有多个 9 时,这将标记为 0,在这种情况下,我们应该只根据 yr_month 休息应该为零来标记第一次出现的 9。
@Mohekar:不,这仅标记每个 id
的前 9 个(我只是更改了 MySQL 特定的表达式,如果你正在使用的话)。
我正在使用 sql server以上是关于根据sql中的条件创建新列?的主要内容,如果未能解决你的问题,请参考以下文章
Python - 使用 +/- 振荡值迭代数据框并根据条件创建新列