Oracle: сравнение нескольких строк в одной таблице на дату - PullRequest
0 голосов
/ 18 января 2020

Я пытаюсь получить результаты на следующих условиях. В моей таблице есть следующие столбцы: id, updateFlag, updateTime. Критерии, если несколько updateDates одинаковы, получить идентификатор с идентификатором updateFlag = 'Y', иначе получить последний updateTime id .

Вот мой SQL Скрипт;

updateFlag возможные значения 'Y', 'N', null

create table customer(id varchar2(20),updateFlag char(1),updateTime DATE);
insert into customer(id,updateFlag,updateTime) values(1,'N',to_date('16-JAN-20 04.54.37','DD-MON-RR HH.MI.SS'));
insert into customer(id,updateFlag,updateTime) values(2,'N',to_date('16-JAN-20 04.54.37','DD-MON-RR HH.MI.SS'));
insert into customer(id,updateFlag,updateTime) values(3,'Y',to_date('16-JAN-20 04.54.37','DD-MON-RR HH.MI.SS'));
commit;

, когда я использую следующий запрос, он работает нормально, так как один из флагов - «Y»;

select * from customer where id in(1,2,3) and  updateFlag='Y' order by updateTime;

, но когда я вставляю следующий скрипт со смесью нулей и «N» для updateFlags, я ожидаю получить «N».

insert into customer(id,updateFlag,updateTime) values(1,'N',to_date('16-JAN-20 04.54.37','DD-MON-RR HH.MI.SS'));
insert into customer(id,updateFlag,updateTime) values(2,'N',to_date('16-JAN-20 04.54.37','DD-MON-RR HH.MI.SS'));
insert into customer(id,updateFlag,updateTime) values(3,null,to_date('16-JAN-20 04.54.37','DD-MON-RR HH.MI.SS'));

и еще одно условие, если недавний updateTime не равен другим строкам, получает недавний идентификатор.

enter image description here

Оценил помощь.

Извините для путаницы перефразируя вопрос здесь.

  1. Получите идентификатор, основанный на самом последнем обновленном времени.
  2. Если есть два или более последних обновленных времени с одинаковым значением, получите идентификатор, который имеет обновленный флаг = 'Y'
  3. Если есть два или более последних updatedTime с одинаковым значением, но ни один из них не имеет флага 'Y', получим значение с 'N'.

Ответы [ 3 ]

1 голос
/ 19 января 2020

Вы можете использовать analytical function следующим образом:

Select * from 
(select c.*, 
       row_number() over (order by updatetime desc, updateflag desc nulls last) as rn
from customer c
where id in (1, 2, 3))
Where rn = 1

Ура !!

0 голосов
/ 18 января 2020

Очень сложно понять, что вы хотите, без примеров данных, которые вы ожидаете получить от вашего запроса. Но если вы хотите получить только одну строку из первого набора данных, который вы нам предоставили, и еще одну строку из другого набора данных, который вы нам дали, тогда это будет запрос, который вам нужен.

Сначала я должен сказать, что я предположил, что вы ошиблись с данными, которые вы нам предоставили. updateDates во втором наборе, что должно отличаться от первого? Может быть, я ошибаюсь ...

Вот это DEMO

select * from customer 
where (updateTime, id) in (
select updateTime, max(case when updateFlag = 'Y' then id 
            else (select max(id) from customer c where c.id = c1.id)
       end)
from customer c1
group by updateTime);

Или, если вы хотите минимальный идентификатор, то:

select * from customer 
where (updateTime, id) in (
select updateTime, min(case when updateFlag = 'Y' then id 
            else (select min(id) from customer c where c.id = c1.id)
       end)
from customer c1
group by updateTime);
0 голосов
/ 18 января 2020

Если я правильно понимаю, вы хотите один ряд. Это упорядочивает их так, что вы хотите сначала:

select *
from customer c
where id in (1, 2, 3) 
order by (case when updateFlag = 'Y' then 1 else 2 end),  -- put those first
         updateTime;

Затем используйте fetch first 1 row only в Oracle 12C + или подзапрос с rownum = 1 во внешнем запросе, чтобы получить только одну строку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...