Есть такая таблица:
create table address
(
id integer primary key,
group_id integer,
address varchar(512),
address_order integer,
address_destination varchar(255)
);
insert into address (id, group_id, address, address_destination, address_order) values
(1, 1, 'Мира 1', 'loading', 1),
(2, 1, 'Пушкина 2', 'loading', 2),
(3, 1, 'Ленина 1', 'unloading', 1),
(4, 1, 'Каменская 2', 'unloading', 2),
(5, 2, 'Мира 1', 'loading', 1),
(6, 2, 'Октябрьская 5', 'loading', 2),
(7, 2, 'Пушкина 2', 'loading', 3),
(8, 2, 'Ленина 1', 'unloading', 1),
(9, 2, 'Каменская 2', 'unloading', 2),
(10, 3, 'Мира 1','unloading', 1),
(11, 3, 'Пушкина 2','unloading', 2),
(12, 4, 'Пушкина 2','loading', 1),
(13, 5, 'Мира 1', 'loading', 1),
(14, 5, 'Пушкина 2', 'loading', 2),
(15, 5, 'Кретова 16', 'loading', 3);
Задача получить id группы адресов (groupd_id) в которой адреса 'Мира 1', 'Пушкина 2' имеют тип loading, идут по порядку (address_order) и других адресов этого типа в группе нет? То есть в этом примере подходит только group_id = 1.
Пришел к такому решению:
select group_id from address
where group_id in (
select group_id from address
where ((address = 'Мира 1' and address_order = 1)
or (address = 'Пушкина 2' and address_order = 2))
and address_destination = 'loading'
group by group_id
having count(*) = 2
) and address_destination = 'loading'
group by group_id
having count(*) = 2
Но не покидает чувство, что это можно сделать проще.
https://www.db-fiddle.com/f/4jyoMCicNSZpjMt4jFYoz5/5124