从 SQL 中的时间序列数据构建邻接表
Posted
技术标签:
【中文标题】从 SQL 中的时间序列数据构建邻接表【英文标题】:Build an adjacency list from timeseries data in SQL 【发布时间】:2020-07-27 21:49:41 【问题描述】:假设我在 mysql 数据库中有以下数据:
table
例如,如果数据如下所示:
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 中的时间序列数据构建邻接表的主要内容,如果未能解决你的问题,请参考以下文章
每个邻接链表中的边结点都是按照序号从大到小的顺序链接而成是啥意思?