代码之家  ›  专栏  ›  技术社区  ›  noobie

Oracle数据库-如何有条件地从结果中选择两行中的一行

  •  0
  • noobie  · 技术社区  · 7 年前

    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
    
    4 回复  |  直到 7 年前
        1
  •  2
  •   Littlefoot    7 年前

    这里有一个选择:

    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>
    
        2
  •  1
  •   codeLover Sumit Tyagi    7 年前

    您可以这样尝试:

    select * from <<table>> outer where outer.flag= 1 
    and exists  (select * from <<table>> inner where inner.flag = 0 and inner.date=outer.date) 
    UNION 
    select * from <<table>> outer where outer.flag= 0 and 
    not exists  (select * from <<table>> inner where inner.flag = 1 and inner.date=outer.date) ;
    
        3
  •  1
  •   Stidgeon    7 年前

    我想试试这个:

    SELECT date, amount, flag
    FROM tableName
    HAVING flag = MAX(flag)
    GROUP BY date, amount,flag
    
        4
  •  1
  •   Stidgeon    7 年前

    SELECT * FROM flags WHERE flag = 1
    UNION 
    SELECT * FROM flags WHERE flag = 0 
    AND flagdate NOT IN (SELECT flagdate FROM flags WHERE flag = 1);
    

    SQLFiddle: http://sqlfiddle.com/#!9/69dc02/2