Staschik
@Staschik

Как сделать запрос с группировкой?

Есть такая таблица:
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
  • Вопрос задан
  • 87 просмотров
Решения вопроса 1
@JuniorNoobie
Сижу в поддержке, пишу мелкие проекты
Можно так, если я правильно понял:
select group_id
from address
where address_destination = 'loading'
group by group_id
having string_agg(address,',' order by address_order) = 'Мира 1,Пушкина 2'
order by group_id
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы