Вы можете определить приоритет в операторе CASE. Назначьте приоритеты каждому КОДУ или списку кодов. Приоритет, рассчитанный в CASE, будет использоваться для упорядочивания внутри ID-раздела перед нумерацией строк функцией row_number anality c. Строки с одинаковым идентификатором и одинаковым приоритетом будут упорядочены случайным образом, поэтому лучше попытайтесь определить приоритеты для всех кодов. Смотрите комментарии в коде:
with your_data as ( --Use your table instead of this CTE
select stack(7,
1,'XXXX',100,
2,'AAAA',200,
1,'YYYY',300,
3,'DDDD',300,
4,'BBBB',200,
2,'CCCC',300,
3,'HHHH',200
) as (ID,CODE,VALUE)
)
select ID, VALUE
from
(
select ID,CODE,VALUE,
row_number() over(partition by ID order by case when CODE='CCCC' then 1 --define priority here
when CODE='XXXX' then 2
when CODE='AAAA' then 3
when CODE='DDDD' then 4
when CODE='HHHH' then 5
--and so on... add more cases
else 99 --default priority
end) rn
from your_data d
)s
where rn=1 --remove duplicates
;
Результат:
OK
1 100
2 300
3 300
4 200