Я бы использовал оконные функции:
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