Как найти записи, у которых существует запись с датой не больше одного дня от предыдущей?

Есть таблица:

  • 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     
→ Ссылка