Как найти записи, у которых существует запись с датой не больше одного дня от предыдущей?
Есть таблица:
- Idclient - Клиент
- Order - Заказ
- Date_time - Дата заказа
- Denial - Отказ
Нужно по клиенту найти заказы с отказом, дата которых отстаёт от предыдущего максимум на 1 день.
Например: Date_time = сегодня, нужно найти за сегодня и за вчера. Если такие заказы с отказами имеются, то нужно показать одобренные заказы по этому клиенту.
В этой задаче мне трудно понять логику поиска 2х заказов с шагом в день, да и заказов по клиенту может быть более 5-и, и даты этих заказов должны сравниваться друг с другом.
Как это можно реализовать ?
Ответы (1 шт):
Автор решения: 0xdb
→ Ссылка
На следующих данных (на db<>fiddle):
select * from clientOrder
/
IDCLIENT IDORDER ORDERDATE DENIAL
---------- ---------- ------------------- ------
1 11 2021-05-01 12:00:00 n
1 12 2021-05-02 12:00:00 y
1 13 2021-05-03 12:00:00 n
2 21 2021-05-01 12:00:00 n
2 22 2021-05-02 14:24:00 y
2 23 2021-05-03 12:00:00 n
3 31 2021-05-01 12:00:00 n
3 32 2021-05-01 12:00:00 n
3 33 2021-05-01 12:00:00 n
4 11 2021-05-01 12:00:00 y
4 11 2021-05-02 12:00:00 n
4 11 2021-05-03 12:00:00 n
9 99 2021-05-01 12:00:00 n
Ожидаю получить, согласно описанию в вопросе, заказы 11, 13 для клиента 1:
select *
from clientOrder t1
where exists (
select null from (
select t2.*, lag (orderDate, 1, date'-4712-01-01') over (
partition by Idclient order by orderDate asc) prevOrderDate
from clientOrder t2
where t2.Idclient = t1.Idclient)
where Denial = 'y'
and orderDate-prevOrderDate <= 1)
and Denial = 'n'
Результат:
IDCLIENT IDORDER ORDERDATE DENIAL
---------- ---------- ------------------- ------
1 11 2021-05-01 12:00:00 n
1 13 2021-05-03 12:00:00 n