Задачка по SQL с собеседования

У меня есть одна таблица следующей структуры: id (int), date_trans(date), time_trans(time), trans_title (text), inn (bigint) Дата транзакции, время, описание транзакции: входящая и исходящая, инн контрагента. Задачка вымышленная из собеседования и показалась сложной, условие такое:

найти все исходящие транзакции контрагенту, которые были совершены не более чем через 30 минут после входящей транзакции от любого другого контрагента. То есть от А компани входящая транзакция >> не более 30 минут >> компании В исходящая транзакция.

Пробую сделать с помощью Обобщенного табличного выражения, но думаю что-то можно и с помощью case...then.

with table_1 as (
    select id, date_trans, time_trans, trans_title, inn
    from transaction
    where trans_title = "Входящий"
    ),
    table_2 as (
    select id, date_trans, time_trans, trans_title, inn
    from transaction
    where trans_title = "Исходящий"
    )

    select table_1.time_trans, table_1.trans_title, table_1.inn, 
        table_2.time_trans, table_2.trans_title, table_2.inn
    from table_1
    join table_2 on (table_1.id = table_2.id)
    where table_1.date_trans = table_2.date_trans
    and table_1.inn <> table_2.inn 
    and table_1.time_trans >= table_2.time_trans + interval '00:30'

Вот с последней строчкой кода не знаю как правильно сделать (and table_1.time_trans >= table_2.time_trans + interval '00:30'). Посоветуйте. Может и в целом неправильное решение


Ответы (1 шт):

Автор решения: Akina
SELECT *
FROM transaction t1
WHERE trans_title = "Исходящий"
  AND EXISTS ( SELECT NULL
               FROM transaction t2
               WHERE t2.trans_title = "Входящий"
                 AND t1.inn <> t2.inn
                 AND t2.time_trans BETWEEN t1.time_trans - interval '00:30'
                                       AND t1.time_trans )
→ Ссылка