假设我在表中存储与用户关联的事件,如下所示(dt代表事件的时间戳):
| dt | user | event | | 1 | 1 | A | | 2 | 1 | D | | 3 | 1 | B | | 4 | 1 | C | | 5 | 1 | B | | 6 | 2 | B | | 7 | 2 | B | | 8 | 2 | A | | 9 | 2 | A | | 10 | 2 | C |
这样我们可以说:
>用户1具有ADBCB的事件序列
> user 2具有事件序列BBAAC
我想要回答的有关这些用户的问题类型很容易表达为对事件序列的常规表达,例如: “哪些用户的事件序列匹配A. * B?”或“哪些用户的事件序列匹配A [^ C] * B [^ C] * D?”等等
什么是一个很好的sql技术或运算符,我可以用来回答这个表结构上的类似查询?
有没有办法有效/动态地生成用户到事件序列的表,然后可以使用正则表达式进行查询?
我目前正在使用Postgres,但我很想知道是否有任何像sqlServer或Oracle这样的大型DBMS也有专门的运算符.
解决方法@H_502_19@
使用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,'' order by dt) as event_sequence
from events
group by userid
) t
where event_sequence ~ 'A.*B'
使用Postgres 8.x你需要找到string_agg()函数的替代品(只是google for it,有很多例子)你需要一个子选择来确保聚合的排序为8.x确实在聚合函数中支持订单.
select userid,string_agg(event,'' order by dt) as event_sequence from events group by userid;
使用该结果,您现在可以在event_sequence上应用正则表达式:
select * from ( select userid,'' order by dt) as event_sequence from events group by userid ) t where event_sequence ~ 'A.*B'
使用Postgres 8.x你需要找到string_agg()函数的替代品(只是google for it,有很多例子)你需要一个子选择来确保聚合的排序为8.x确实在聚合函数中支持订单.