Return 每个键的行基于 Oracle SQL 中的优先级
Return row per key based on precedence in Oracle's SQL
我有如下数据。有些项目有不止一种类型 ID。
我只需要 select 每个 id 中的一个。
我的条件是
- if exists (type id of item == 1) select 只有那一行;
- 如果不存在类型 ID 为 1 检查是否存在(项目的类型 ID == 2)select
那一行;
- 如果不存在,则类型 ID 为 2 检查是否存在(项目的类型 ID == 3)
select那一行;
我不需要类型 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
;
我有如下数据。有些项目有不止一种类型 ID。 我只需要 select 每个 id 中的一个。
我的条件是
- if exists (type id of item == 1) select 只有那一行;
- 如果不存在类型 ID 为 1 检查是否存在(项目的类型 ID == 2)select 那一行;
- 如果不存在,则类型 ID 为 2 检查是否存在(项目的类型 ID == 3) select那一行;
我不需要类型 ID 不同于 1,2,3 的数据
id | name | type_id |
---|---|---|
23 | xx | 1 |
24 | yy | 1 |
24 | yy | 2 |
24 | yy | 3 |
25 | zz | 2 |
26 | 2 | |
26 | 3 | |
27 | ww | null |
28 | tt | 4 |
28 | rr | 5 |
预期结果
id | name | type_id |
---|---|---|
23 | xx | 1 |
24 | yy | 1 |
25 | zz | 2 |
26 | 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
;