Сравнение двух максимальных дат с условием в Oracle SQL - PullRequest
0 голосов
/ 26 августа 2018

У меня есть данные, как показано ниже

ID  date    state
1   24-Aug-18   Not defined
1   23-Aug-18   Incorrect
1   22-Aug-18   Incorrect
1   21-Aug-18   Incorrect
1   1-Aug-18    Correct
1   23-Jul-17   Incorrect
1   22-Jul-17   Incorrect
1   21-Jul-17   Incorrect
1   10-Jul-17   Correct

Запись 1 может оставаться в неправильном состоянии в течение 3 дней после того, как она переходит к «не определено» (если только какое-либо обновление не было внесено в запись. Если сделано, то оно возвращается к «Исправить»). Неопределенное состояние следует избегать. Теперь мне нужно определить запрос так, чтобы запрос мог идентифицировать минимальную дату последней записи, когда запись перешла в неправильное состояние, то есть в этом случае 21 августа 2018 года. Также проблема здесь в том, что таблица не имеет уникальных ключей.

Я пробовал приведенный ниже код, но он выдает ошибку 'ORA-01427: однострочный подзапрос возвращает более одной строки'

select id, min(date) from table where state = 'Incorrect' group by id having
((Select trunc(MAX (date)) from table where state = 'Incorrect'
group by id) >= (select trunc(Max (date))  from table where state = 'Correct'
group by id))

Ответы [ 2 ]

0 голосов
/ 26 августа 2018

Для каждого идентификатора вы ищете неправильные записи, за которыми не следует ни одной правильной записи.Из них возьмите первый.

select id, min(date)
from mytable i
where state = 'Incorrect'
and not exists
(
  select *
  from mytable c
  where c.id = i.id
    and c.state = 'Correct'
    and c.date > i.date
)
group by id
order by id;
0 голосов
/ 26 августа 2018

Хммм, я думаю, это делает то, что вы хотите:

select id, min(date) as min_latest_incorrect_date
from (select t.*,
             max(case when state = 'Correct' then date end) over (partition by id) as max_date_correct
      from t
     ) t
where (date > max_date_correct or max_date_correct is null) and
      state = 'Incorrect'
group by id
...