выберите наиболее точную запись, которая не была создана по ошибке

#sql #oracle

#sql #Oracle

Вопрос:

У меня есть запрос, в котором мне нужно выбрать самый последний правильный случай клиента, но мне также нужно иметь возможность выбирать любые предыдущие случаи, которые были у клиента. У меня есть мой запрос, но когда я просматривал данные, я заметил, что у одного клиента было 3 случая:

ИДЕНТИФИКАТОР КЛИЕНТА ИДЕНТИФИКАТОР ОБРАЩЕНИЯ СТАТУС ОБРАЩЕНИЯ Дата СОЗДАНИЯ РЕГИСТРА
10079 2796 Открыть 11 января 2021 г.
10079 2784 Активный 09 января 2021 г.
10079 1867 Закрыто 29 января 2020 г.

Мне нужно иметь возможность выбирать как «Закрытый«, так и «Активный» регистр клиента. «Открытый» случай является ошибкой и не должен существовать в системе, поскольку клиент с «Активным» обращением не может также иметь «Открытый» случай. В базе данных есть несколько подобных экземпляров для разных клиентов, мне было интересно, может ли кто-нибудь, пожалуйста, помочь мне выяснить, как я могу использовать sql для контроля этих системных ошибок в базе данных oracle? Пожалуйста, обратите внимание: не все «Открытые» обращения являются системными ошибками: у клиента не может быть «Активного» и «Открытого» обращения одновременно.

Комментарии:

1. привет, интересно, возможно, a where not exists(...) может помочь отфильтровать ситуации, когда открытый случай существует рядом с активным.

2. Я думаю, что ваш вопрос нуждается в большем количестве выборочных данных — что включать, а что не включать.

3. @IronMan, ты знаешь, как я могу это сделать? Тем более, что я обеспокоен тем, что если я использую предложение where, оно отменит выбор клиентов, у которых есть «Открытая» оценка, которая является полностью действительной, а не системной ошибкой

Ответ №1:

Если вы хотите «открывается» только тогда, когда предыдущий статус не «активен» (один из способов чтения вашего вопроса, тогда вы можете использовать lag() и некоторую логику фильтрации:

 select t.*
from (select t.*,
             lag(case_status) over (partition by client_id order by created_date) as prev_case_status
      from t
     ) t
where status <> 'open' or
      (prev_status is null or prev_status <> 'active')
 

Комментарии:

1. Здравствуйте, оцените запрос, который у вас есть выше 🙂 Просто интересно, если бы я применил этот запрос к клиенту, который у меня есть выше, выдаст ли он мне только их «Активный» и «Закрытый» регистр, а не «Открытый» регистр (что является ошибкой)? Я пытаюсь, чтобы в моем конечном результате не отображался «Открытый» случай