Я использую PostgreSQL 9.5.19, DBeaver 6.3.4
У меня есть таблица, в которой одна строка - имя пользователя, место, которое он посетил, время, когда он там был
Мне нужно выбрать все пары мест, где находился какой-либо пользователь (если пользователь находился на месте a, и поместить место bi, нужно примерно так: пользователь, место a, место b, время на месте a, время на месте b)
Таблица прудов:
CREATE TABLE example.example (
tm timestamp NOT NULL,
place_name varchar NOT NULL,
user_name varchar NOT NULL
);
Некоторые примеры данных:
INSERT INTO example.example (tm, place_name, user_name)
values
('2020-02-25 00:00:19.000', 'place_1', 'user_1'),
('2020-03-25 00:00:19.000', 'place_2', 'user_1'),
('2020-02-25 00:00:19.000', 'place_1', 'user_2'),
('2020-03-25 00:00:19.000', 'place_1', 'user_3'),
('2020-02-25 00:00:19.000', 'place_2', 'user_3');
Я пробую этот скрипт:
select
t.user_name
,t.place_name as r1_place
,max(t.tm) as r1_tm
,t2.place_name as r2_place
,min(t2.tm) as r2_tm
from example.example as t
join example.example as t2 on t.user_name = t2.user_name
and t.tm < t2.tm
and t.place_name <> t2.place_name
where t.tm between '2020-02-25 00:00:00' and '2020-03-25 15:00:00'
and t2.tm between '2020-02-25 00:00:00' and '2020-03-25 15:00:00'
group by t.user_name
, t.place_name
, t2.place_name
Похоже, он дает мне правильный результат, но он работает очень медленно. Могу ли я оптимизировать это как-нибудь?