我有一些日志文件,其中包含时间戳、id和操作。下面是一些示例数据。实际数据有数百万行长。我希望将用户在给定会话中执行的所有操作分组。会话可以定义为任何连续的日志条目(来自特定用户),其中前一个时间戳之间的间隔不超过30分钟。
timestamp id action
2014-06-30 21:57:16 234 1
2014-06-30 16:47:05 793 3
2014-06-30 16:47:15 793 1
2014-06-30 16:47:50 793 2
2014-06-30 16:48:07 793 5
2014-06-30 16:48:08 793 6
2014-06-30 16:48:48 793 7
2014-06-30 16:49:26 793 1
2014-06-30 16:49:28 993 3
2014-06-30 04:24:39 229 2
2014-06-30 21:53:38 822 4
我希望有人能给我指出正确的方向。我肯定这是以前做过的,但是在网上找不到任何东西。我想我找错问题了。
寻找基于sql的东西。
1条答案
按热度按时间wqsoz72f1#
我本打算写这篇文章,但很快就变得相当复杂,不幸的是我不是免费工作:)。我可以向你解释你该怎么做。
基本上,您需要从id列中选择一个惟一值列表(我假设这些值是用户id的)。然后,您需要逐个遍历id的列表,并为每个id选择对应于该id的时间戳列表,按升序排列。
然后,您需要选择最早的时间戳,并将其与升序列表中的下一个时间戳进行比较,以查看下一个时间戳是否相差<或>30分钟。如果其<,则将其、id和操作值存储在新表中,并使用标识符将其标记为会话的一部分。然后取第二个时间戳,并将其与列表中的下一个时间戳进行比较。如果它<,则存储它并以这种方式继续浏览列表。但是,如果下一个值大于30分钟,则生成一个新的唯一会话id,然后继续浏览列表。
总的来说,我不建议您在sql中这样做,特别是如果您计划在某个正在生产的服务器上这样做,并且正在积极地写入这个表,因为如果它真的那么大,您将导致一些大量的锁。如果可能的话,最好在某个应用层中这样做。如果不可能,我建议您在开始分析之前将数据复制到一些临时表中。
如果您计划不止一次地这样做,我还可能建议您考虑是否可以在数据生成的任何位置向数据中添加会话标识符。