У меня есть таблица:
create table transaction_log (
id serial,
operation_type character varying(36),
date timestamp with time zone,
sum double precision,
user_id integer,
PRIMARY KEY(id)
);
Он поддерживает два типа операций: block
и unblock
для нескольких пользователей (contragent_id) и лотов (lot_id) и поля даты и времени operation
.
- Один пользователь может иметь несколько операций блокировки и разблокирования
- Записи с блочной операцией могут иметь одну разблокированную операцию после.
- Блоки и разблокировки являются последовательными. Для пользователя должен быть блок, а следующий блок может быть только после того, как произошла операция разблокирования.
- Дата и время разблокирования могут совпадать с блокировкой. Это означает, что заблокирован и мгновенно разблокирован.
- Один пользователь может иметь несколько последовательностей операций блокировки и разблокировки на смешанной временной шкале.
- идентификатор уникален
Например:
id, sum, operation_type, date, user_id
1, 5900, blocked, 2018-01-05 11:00, 1
2, 3500, blocked, 2018-01-08 12:00, 2
3, 5900, unblock, 2018-02-11 09:00, 1
4, 1000, blocked, 2018-01-09 05:00, 3
5, 3500, unblock, 2018-01-24 19:00, 2
Поэтому мне нужно получить SQL для извлечения всех операций блока с датой соответствующей операции разблокирования, если она существует. Например: block_ID, сумма, block_date, unblock_date. Итак, из данных примера мне нужно получить:
Например:
block_ID, sum, blocked_date, unblock_date
1, 5900, 2018-01-05 11:00, 2018-02-11 09:00
2, 3500, 2018-01-08 12:00, 2018-01-24 19:00
4, 1000, blocked, 2018-01-09 05:00, null
Полагаю, для этого мне нужен оператор WITH, но я не могу понять, как правильно сопоставлять записи.
Любая помощь приветствуется.
Кстати, Postgres 9,4