Можно ли использовать lead/lag в postgresql с where ? Есть ли обходные пути?
у меня есть таблица с некоторыми событиями
event time id user_id
a 11:00 1 1
a 12:00 2 1
b 13:00 3 1
a 13:30 4 2
b 14:00 5 2
b 14:10 6 2
Я хочу взять для каждого user_id для события b то событие а, следом за которым оно(событие b) идет,
например, для b(id=5) и для b(id=6) это a(id=4), для b(id=3) это a(id=2).
Кажется, эту проблему бы решало использование lag(id) over (partition by user_id order by time) с where event='a', но я нигде не увидела возможности использования where clause с lead/lag. Подскажите, пожалуйста, есть ли способ решить мою задачу ?
Upd скрипт:
drop table if exists t1;
create table t1
(
event char
,time timestamp
,id integer
,user_id integer
);
insert into
t1
values('a', '2021-08-09 11:00', 1, 1),('a', '2021-08-09 12:00', 2, 1),('b', '2021-08-09 13:00', 3, 1),('a', '2021-08-09 13:30',
4, 2),('b', '2021-08-09 14:00', 5, 2),('b', '2021-08-09 14:10', 6, 2);
Ожидаемый результат:
event time id user_id lag_id
a 11:00 1 1 any value
a 12:00 2 1 any value
b 13:00 3 1 2
a 13:30 4 2 any value
b 14:00 5 2 4
b 14:10 6 2 4
Ответы (1 шт):
Автор решения: Akina
→ Ссылка
SELECT t1.*,
( SELECT id
FROM test t2
WHERE t2.event = 'a'
AND t2.time < t1.time
AND t1.event = 'b'
ORDER BY t2.time DESC LIMIT 1) lag_id
FROM test t1
https://dbfiddle.uk/?rdbms=postgres_12&fiddle=b64ac6c6abd7e4cca344ffa0cf9aaa18