Chỉ cần thử cách tiếp cận của Gordon bằng cách sử dụng PostgreSQL 9.5.4 và nó phàn nàn rằng
có nghĩa là sử dụng lag()
với FILTER
không được đồng ý. Vì vậy, tôi đã sửa đổi truy vấn của Gordon bằng cách sử dụng max()
, một khung cửa sổ khác và 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';
Đã xác minh rằng điều này hoạt động với PostgreSQL 9.5.4.
Cảm ơn Gordon về FILTER
lừa!