我正在尝试为用户关联两种类型的事件。我想查看所有事件“B”以及该用户在“A”事件之前的最新事件“A”。如何实现这一目标呢?特别是,我正在尝试在 Postgres 中做到这一点。
我希望可以在窗口函数中使用“where”子句,在这种情况下,我基本上可以使用“where event='A'”执行 LAG(),但这似乎不可能。
有什么建议吗?
数据示例:
|user |time|event|
|-----|----|-----|
|Alice|1 |A |
|Bob |2 |A |
|Alice|3 |A |
|Alice|4 |B |
|Bob |5 |B |
|Alice|6 |B |
期望的结果:
|user |event_b_time|last_event_a_time|
|-----|------------|-----------------|
|Alice|4 |3 |
|Bob |5 |2 |
|Alice|6 |3 |
刚刚使用 PostgreSQL 9.5.4 尝试了 Gordon 的方法,它抱怨说
未针对非聚合窗口函数实现 FILTER
这意味着使用lag()
with FILTER
不允许。所以我使用修改了戈登的查询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
trick!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)