Создать новый столбец на основе условия в sql? - PullRequest
0 голосов
/ 08 апреля 2020
   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, проверка удостоверения личности, если нет более высокого вознаграждения, чем 9 в предыдущий 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 голосов
/ 08 апреля 2020

Я бы использовал оконные функции:

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

Демонстрация на 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
...