Return 每个键的行基于 Oracle SQL 中的优先级

Return row per key based on precedence in Oracle's SQL

我有如下数据。有些项目有不止一种类型 ID。 我只需要 select 每个 id 中的一个。

我的条件是

我不需要类型 ID 不同于 1,2,3 的数据

id name type_id
23 xx 1
24 yy 1
24 yy 2
24 yy 3
25 zz 2
26 qq 2
26 qq 3
27 ww null
28 tt 4
28 rr 5

预期结果

id name type_id
23 xx 1
24 yy 1
25 zz 2
26 qq 2

您可以使用 row_number():

select t.*
from (select t.*,
             row_number() over (partition by id order by type_id) as seqnum
      from t
      where type_id in (1, 2, 3)
     ) t
where seqnum = 1;

注意:这利用了您要查找的类型是有序的这一事实。如果它们是任意的,那么您可能需要在 order by 中使用 case 表达式。例如,如果您希望优先级为 2、1、3:

order by (case type_id when 2 then 1 when 1 then 2 when 3 then 3 end)
select id,
       min(name) keep (dense_rank first order by type_id) as name,
       min(type_id) as type_id
from   table_name
where  type_id in (1, 2, 3)
group  by id
;