加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

查询SQL中的行序列

发布时间:2020-12-12 07:02:24 所属栏目:MsSql教程 来源:网络整理
导读:假设我在表中存储与用户关联的事件,如下所示(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
假设我在表中存储与用户关联的事件,如下所示(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也有专门的运算符.

解决方法

使用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确实在聚合函数中支持订单.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读