База данных Oracle - как условно выбрать одну строку из двух строк из результата - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть следующие данные в таблице 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

Ответы [ 4 ]

0 голосов
/ 12 сентября 2018

Вы можете сначала попытаться получить все записи с флагом 1, а затем найти все записи с флагом 0, которые не отображаются в первом наборе полученных записей:

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

0 голосов
/ 12 сентября 2018

Я бы попробовал это:

SELECT date, amount, flag
FROM tableName
HAVING flag = MAX(flag)
GROUP BY date, amount,flag
0 голосов
/ 12 сентября 2018

Вот один из вариантов:

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>
0 голосов
/ 12 сентября 2018

Вы можете попробовать вот так:

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) ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...