首页 > 解决方案 > Oracle数据库 - 如何有条件地从结果中选择两行中的一行

问题描述

我在 Oracle 表中有以下数据:

Date             Amount  Flag
12/09/2018 0:00  191     1
12/09/2018 0:00  190     0
13/09/2018 0:00  187     0
14/09/2018 0:00  200     1
14/09/2018 0:00  201     0

我想检索所有标志为 0 的记录,如果存在标志为 1 的重复行,则应优先考虑。所以上表的最终结果应该是这样的:

Date             Amount Flag
12/09/2018 0:00  191    1
13/09/2018 0:00  187    0
14/09/2018 0:00  200    1

标签: sqloracle

解决方案


这是一个选项:

SQL> with test (cdate, amount, flag) as
  2  (select date '2018-09-12', 191, 1 from dual union all
  3   select date '2018-09-12', 190, 0 from dual union all
  4   select date '2018-09-13', 187, 0 from dual union all
  5   select date '2018-09-14', 200, 1 from dual union all
  6   select date '2018-09-14', 201, 0 from dual
  7  )
  8  select cdate, amount, flag
  9  from (select cdate, amount, flag,
 10               row_number() over (partition by cdate order by flag desc) rn
 11        from test
 12       )
 13  where rn = 1;

CDATE          AMOUNT       FLAG
---------- ---------- ----------
12/09/2018        191          1
13/09/2018        187          0
14/09/2018        200          1

SQL>

推荐阅读