创建基于SQL条件的新列?

时间:2020-04-08 12:30:35

标签: sql sql-server tsql window-functions

   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

我需要创建一个基于“奖励”列的新列。 奖励为9的情况下,条件为1,否则为0。

条件为:

  1. 对于特定的parent_id,id检查是否有不高于上一个yr_month的奖励(如果是,则为0,否则为1)

  2. 只有前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

1 个答案:

答案 0 :(得分:0)

我将使用窗口功能:

IORING_SETUP_SQPOLL

如果满足以下条件,则io_uring表达式将返回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

  • 当前记录的case1

  • ,对于reward等于或大于9

  • 的同一parent_id,没有“先前”记录

如果您正在运行MySQL,则reward表达式可以简化为:

9

Demo on DB Fiddle

PARENT_ID | ID | YR_MONTH | REWARD | 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