Вы можете использовать exists
:
select t.*
from mytable t
where
category in ('A', 'B')
and exists (
select 1
from mytable t1
where t1.id = t.id and t1.category in ('A', 'B') and t1.category <> t.category
)
Другой подход - это количество окон (при условии отсутствия дубликатов в (id, category)
кортежах):
select id, price, category
from (
select t.*, count(*) over(partition by id) cnt
from mytable t
where category in ('A', 'B')
) t
where cnt > 1