Создать новый столбец и пометить как 1 или 0? - PullRequest
2 голосов
/ 14 апреля 2020

Таблица:

  PARENT_ID    ID   YR_MONTH    REWARD
1    1          11   201601        3 
2    1          11   201605        9   
3    1          11   201609        12         
4    1          12   201601        6          
5    1          12   201605        9          
6    1          12   201609        9          
7    2          21   201601        15         
8    2          21   201605        9          
9    2          21   201609        12         
10   2          22   201601        9          
10   2          22   201605        9          
10   2          23   201609        9          

Мне нужно создать новый столбец на основе столбца reward. Там, где Вознаграждение равно 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          11   201609        12         0
4    1          12   201601        6          0
5    1          12   201605        9          1
6    1          12   201609        9          0
7    2          21   201601        15         0
8    2          21   201605        9          0
9    2          21   201609        12         0
10   2          22   201601        9          1
10   2          22   201605        9          0
10   2          23   201609        9          1

Ответы [ 2 ]

1 голос
/ 14 апреля 2020
with t  (PARENT_ID,    ID,   YR_MONTH,    REWARD) as (
  select   1,          11,   201601,        3 from dual union all 
  select   1,          11,   201605,        9 from dual union all   
  select   1,          11,   201609,        12 from dual union all         
  select   1,          12,   201601,        6 from dual union all          
  select   1,          12,   201605,        9 from dual union all          
  select   1,          12,   201609,        9 from dual union all          
  select   2,          21,   201601,        15 from dual union all         
  select   2,          21,   201605,        9 from dual union all          
  select   2,          21,   201609,        12 from dual union all         
  select   2,          22,   201601,        9 from dual union all          
  select   2,          22,   201605,        9 from dual union all          
  select   2,          23,   201609,        9 from dual 
)
select t1.*, case when reward = 9 and grp = 1 then 1 else 0 end reward_status from (
  select t.*, sum(case when reward < 9 then 0 else 1 end) over (partition by parent_id, id order by yr_month) grp
  from t
) t1
order by parent_id, id, yr_month;

Сначала сгруппируйте строки в зависимости от вашего состояния. Для этого я использовал функцию SUM () analyti c. Затем во внешнем запросе просто сопоставьте, если 9 является первым в группе.

0 голосов
/ 14 апреля 2020

для конкретного parent_id, идентификатор проверяет, нет ли более высокого вознаграждения, чем 9, в любом из предыдущих yr_month, если да, то 0 еще 1.

Я интерпретирую это как "если предыдущий year_month больше 9, чем 1, иначе 0. "

Я думаю, вы хотите lag():

select t.*,
       (case when lag(reward) over (partition by parent_id order by year_month) > 9
             then 1 else 0
        end) as reward_status
from t;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...