Можно ли использовать 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

→ Ссылка