【问题标题】:Oracle how to return rows based on condition?Oracle如何根据条件返回行?
【发布时间】:2021-10-02 09:02:02
【问题描述】:

我正在尝试根据标志列返回 id 和 name。如果 id 有一个带有 flag = 1 的行,我的查询应该只返回这些行。如果它没有 flag=1 值,它应该返回 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

【问题讨论】:

  • 能否将预期的输出添加到您的问题中?
  • 添加了预期的输出

标签: sql oracle plsql oracle-sqldeveloper


【解决方案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
;

【讨论】:

    【解决方案2】:

    假设flag列仅包含0或1,选择标志等于给定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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-13
      • 1970-01-01
      • 2014-04-16
      • 1970-01-01
      • 2023-01-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多