SQL 查询从日志表计算访问持续时间

标签 sql mysql duration

我有一个 MySQL 表 LOGIN_LOG,其中包含字段 ID、PLAYER、TIMESTAMP 和 ACTION。 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)

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

最佳答案

鉴于您拥有的数据,您可能没有什么比这更快的了,因为您必须查看登录和注销记录,并确保同一用户没有其他登录(或注销?)记录两者之间。

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

如果您可以将数据转换成一种格式,其中 LOGIN 和相应的 LOGOUT 时间都在同一条记录中,那么您可以极大地简化查询。我不清楚 SessionManager 是否为您执行此操作。

关于SQL 查询从日志表计算访问持续时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/350780/

相关文章:

MySQL数据库帮助: How do I find X in every column and delete it?

mysql - 从外部 Mysql Master 复制 Google Cloud 实例

mysql - 在 Rails 上插入一个值 has_and_belongs_to_many 关联表

javascript - knex.where容易受到sql注入(inject)攻击吗?

MySQL 计算两个日期之间的差异,但有一些变化

mysql - SQL - 是否有相反但等效的 UNION 函数?

java - 查找音符保持的时间MIDI

function - 如何将 time.Duration 类型传递给 go 函数?

json - 使用 Swagger ,如何定义持续时间参数?

sql - 为 Integer 数据类型插入带有单引号的语句