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