1

我有一个带有字段 ID、PLAYER、TIMESTAMP 和 ACTION 的 MySQL 表 LOGIN_LOG。ACTION 可以是“登录”或“注销”。只有大约 20% 的登录有伴随的注销行。对于那些这样做的人,我想计算平均持续时间。

我在想类似的东西

select avg(LL2.TIMESTAMP - LL1.TIMESTAMP)
from LOGIN_LOG LL1
inner join LOGIN_LOG LL2 on LL1.PLAYER = LL2.PLAYER and LL2.TIMESTAMP > LL1.TIMESTAMP
left join LOGIN_LOG LL3 on LL3.PLAYER = LL1.PLAYER
  and LL3.TIMESTAMP between LL1.TIMESTAMP + 1 and LL2.TIMESTAMP - 1
  and LL3.ACTION = 'login'
where LL1.ACTION = 'login' and LL2.ACTION = 'logout' and isnull(LL3.ID)

这是最好的方法,还是有更有效的方法?

4

4 回答 4

1

鉴于您拥有的数据,您可能无法做任何更快的事情,因为您必须查看 LOGIN 和 LOGOUT 记录,并确保两者之间的同一用户没有其他 LOGIN(或 LOGOUT?)记录.

或者,找到一种方法来确保断开连接记录注销,以便数据完整(而不是 20% 完整)。但是,查询可能仍然必须确保满足所有条件,因此它不会对查询有太大帮助。

如果你能把数据变成LOGIN和相应的LOGOUT时间都在同一条记录中的格式,那么你可以极大地简化查询。我不清楚 SessionManager 是否为您这样做。

于 2008-12-08T20:41:50.667 回答
0

你有一个可以使会话超时的 SessionManager 类型的对象吗?因为可以在那里记录超时,并且您可以从中获取上次活动时间和超时时间。

或者您记录网站/服务上的所有活动,因此您可以直接查询网站/服务访问时长,并查看他们执行了哪些活动。对于网站,Apache 日志分析器可能会生成所需的统计信息。

于 2008-12-08T20:35:10.413 回答
0

我同意 JeeBee,但 SessionManager 类型对象的另一个优点是您可以处理 sessionEnd 事件并编写一个包含活动时间的注销行。这样,您可能会从 20% 的伴随注销行变为 100% 的伴随注销行。对于所有会话,查询活动时间将变得微不足道且一致。

于 2008-12-08T20:40:24.770 回答
0

如果只有 20% 的用户实际注销,则此搜索不会为您提供每个会话的非常准确的时间。衡量平均用户会话时长的更好方法是计算操作之间的平均时间,或 avg。每页时间。然后,这可以乘以每次访问的平均页面/操作数,以提供更准确的时间。

此外,您可以确定平均值。每个页面的时间,然后让您的会话结束时间 = 到该点的会话时间 + 在他们最后一页上花费的平均时间。这将为您提供更细粒度(和准确)的每次会话花费的时间测量。

关于给定的 SQL,它似乎比您真正需要的要复杂。这种统计操作通常可以在数据库外部的代码中更好地处理/更易于维护,您可以在其中拥有您选择的任何语言的全部功能,而不仅仅是 SQL 用于统计计算的相当复杂的能力

于 2008-12-08T20:42:27.153 回答