根据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 如果:

当前记录的reward9

对于相同的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中的条件创建新列?的主要内容,如果未能解决你的问题,请参考以下文章

根据条件在 Spark SQL 或 MySQL 中生成新列

Python - 使用 +/- 振荡值迭代数据框并根据条件创建新列

如何根据一个数据帧中的列值和R中另一个数据帧的列标题名称有条件地创建新列

python 根据条件创建新列

根据 if-elif-else 条件创建新列时出错

根据前 n 行有条件地创建新列