С NOT EXISTS
:
select m.* from mytable m
where m.term_code = (
case when not exists (select 1 from mytable where userid = m.userid and term_code = 201930)
then 201940
else 201930
end
)
Или, если вы хотите только userid
и term_code
, то вы можете сделать это с помощью простого агрегирования:
select userid, min(term_code) term_code
from mytable
where term_code in (201930, 201940)
group by userid
Если вы Если вам нужна полная строка из таблицы, то вы можете присоединиться к ней:
select m.*
from mytable m inner join (
select userid, min(term_code) term_code
from mytable
where term_code in (201930, 201940)
group by userid
) t on t.userid = m.userid and t.term_code = m.term_code
Или с помощью оконной функции ROW_NUMBER()
:
select t.userid, t.term_code, t.race, t.gender
from (
select m.*,
row_number() over (partition by userid order by term_code) rn
from mytable m
where m.term_code in (201930, 201940)
) t
where t.rn = 1
См. demo, Результаты:
> USERID | TERM_CODE | RACE | GENDER
> :----- | --------: | :--- | :-----
> Bob | 201930 | null | null
> Tim | 201940 | null | null