Oracle如何根据条件得到return行?

Oracle how to return rows based on condition?

我正在尝试 return 基于标志列的 ID 和名称。如果 id 有一个带有 flag = 1 的行,我的查询应该只 return 这些行。如果它没有 flag=1 值,它应该 return 带有 flag = 0 的行。最好的方法是什么?这是示例数据:

id name flag

5  aa    1
5  bb    0
6  cc    1
10 dd    0
11 ee    1
11 ee    0

预期输出为:

id name flag

5  aa    1
6  cc    1
10 dd    0
11 ee    1

您可以使用 keep dense_rank 聚合函数来实现,如下所示。

with t (id, name, flag) as (
select 5 , 'aa', 1 from dual union all
select 5 , 'bb', 0 from dual union all
select 6 , 'cc', 1 from dual union all
select 10, 'dd', 0 from dual union all
select 11, 'ee', 1 from dual union all
select 11, 'ee', 0 from dual
)
select id
    , max(name)keep(dense_rank last order by id, flag) name
    , max(flag)keep(dense_rank last order by id, flag) flag
from t
where flag in (0, 1)
group by id
order by id
;

假设 flag 列仅包含 0 或 1,select 行其标志等于给定 id 的标志的最大值:

select id, name, flag
from (
  select id, name, flag, max(flag) over (partition by id) as m
  from your_table
) x
where x.flag = x.m