My table :
id | role |
---|---|
b | f |
b | s |
b | g |
a | s |
a | f |
c | f |
I want a distinct id
but with corresponding role
, with this logic:
If g exists select g if not
if s exists select s if not
if f exists select f.
Query should yield :
id | role |
---|---|
b | g |
a | s |
c | f |
I tried group by id
, but role
cannot be sorted in a useful order.
CodePudding user response:
select id
,role
from (
select *
,rank() over(partition by id order by case when role = 'g' then 2 when role = 's' then 1 end desc) as rnk
from t
) t
where rnk = 1
id | role |
---|---|
a | s |
b | g |
c | f |