使用Postgres 9.x,这实际上很容易:
select userid,
string_agg(event, '' order by dt) as event_sequence
from events
group by userid;
使用该结果,您现在可以在event_sequence上应用正则表达式:
select *
from (
select userid,
string_agg(event, '' order by dt) as event_sequence
from events
group by userid
) t
where event_sequence ~ 'A.*B'
使用Postgres 8.x,您需要找到string_agg()函数的替代品(仅适用于google,那里有很多示例),并且需要进行子选择以确保聚合的排序为8.x确实支持order by
汇总功能。