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
我正在尝试 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