我有一些包含时间戳,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的东西。
答案 0 :(得分:0)
我打算写这个,但很快就变得相当复杂,不幸的是我不能免费工作:)。我可以向你解释你必须做什么。
基本上,您需要从ID列中选择一个唯一值列表(我假设这些是用户ID)。然后,您需要逐个遍历ID列表,并为每个ID选择一个与该ID对应的时间戳列表,按升序排序。
然后,您需要选择最早的时间戳,并将其与升序列表中的下一个时间戳进行比较,以查看下一个时间戳是否为<或者> 30分钟的差异。如果&lt ;,将它,ID和Action值存储在新表中,并带有标识符以将其标记为会话的一部分。然后取第二个时间戳,并将其与列表中的下一个时间戳进行比较。如果它&lt ;,存储它并以这种方式继续通过列表。但是,如果下一个值是> 30分钟后,生成一个新的唯一会话ID,然后继续浏览列表。
总的来说,这并不是你推荐在sql中做的事情,特别是如果你打算在生产某个地方的某个服务器上做这件事并主动写入这个表,因为如果真的那么大,你会引起一些大规模的锁。如果可能的话,这应该在某个应用程序层中做得更好。如果那不可能,id会建议您在开始分析数据之前将数据复制到某些临时表中。
如果您打算不止一次这样做,id也可能建议您查看是否可以在数据生成的地方添加会话标识符。