Задачка по 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 шт):
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 )