从 SQL 中的时间序列数据构建邻接表

Posted

技术标签:

【中文标题】从 SQL 中的时间序列数据构建邻接表【英文标题】:Build an adjacency list from timeseries data in SQL 【发布时间】:2020-07-27 21:49:41 【问题描述】:

假设我在 mysql 数据库中有以下数据:

table

时间戳 事件 session_id

例如,如果数据如下所示:

timestamp                 event         session_id
2014-01-01 01:01:02       Login         1234
2014-01-01 01:01:03       Like          1234
2014-01-01 01:01:05       Logout        1234

要得到这样的结果:

session_id       from_event        event            
1234             null              Login
1234             Login             Like
1234             Like              Logout

我的想法是将事件作为有序数组获取:

select session_id, group_concat(event order by timestamp) 
from table 
group by session_id

但是从那里我不确定我将如何构建邻接列表(在 sql 中)。

【问题讨论】:

在这种情况下,左连接就足够了 【参考方案1】:

如果您运行的是 MySQL 8.0,您可以使用窗口函数lag() 来获取同一会话的“上一个”事件:

select
    session_id,
    lag(event) over(partition by session_id order by timestamp) from_event,
    event 
from mytable

在早期版本中,一种替代方法是相关子查询:

select
    session_id,
    (
        select t1.event 
        from mytable t1 
        where t1.session = t.session and t1.timestamp < t.timestamp
        order by t1.timestamp desc
        limit 1
    ) from_event,
    event
from mytable t

【讨论】:

mysql8.0 比我现在的要早/好几光年...

以上是关于从 SQL 中的时间序列数据构建邻接表的主要内容,如果未能解决你的问题,请参考以下文章

从邻接表数据数组中获取路径数组

【数据结构】怎么把图的邻接表表示转化为图的邻接矩阵表示?

每个邻接链表中的边结点都是按照序号从大到小的顺序链接而成是啥意思?

用广度优先遍历能将邻接表转化成逆邻接表吗

数据结构问题 在邻接表中啥是表节点?啥是表头节点?啥是头节点?

从记录器表构建SQL查询