Току-що опитах подхода на Гордън с помощта на PostgreSQL 9.5.4 и се оплака, че
което означава използване на lag()
с FILTER
не е позволено. Така че модифицирах заявката на Gordon с помощта на max()
, различна рамка на прозорец и CTE:
WITH subq AS (
SELECT
"user", event, time as event_b_time,
max(time) FILTER (WHERE event = 'A') OVER (
PARTITION BY "user"
ORDER BY time
ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING
) AS last_event_a_time
FROM events
ORDER BY time
)
SELECT
"user", event_b_time, last_event_a_time
FROM subq
WHERE event = 'B';
Проверено, че това работи с PostgreSQL 9.5.4.
Благодаря на Гордън за FILTER
трик!