mysql - 基于 session 计数器配对事件并在 mySQL 中查找时间增量

标签 mysql sql session events

我读过许多涉及在 SQL 中配对记录的 SO 问题,但没有一个使用像这样的 session 计数器。我已经简化了应该非常适用于许多问题的通用实例。

基本上我有一个 mySQL 表记录带有时间戳的单个事件和一个递增的“ session 计数器”,每个新 session 都会重置为 0,如下所示:

time  counter
t0    0
t1    1
t2    2
t3    0
t4    1
t5    0
t6    1
t7    2
t8    3
t9    4

我想获取该数据并将每个 session 的第一个和最后一个时间戳(并最终计算时间增量)配对到每个 session 的一行中。所以所需的输出将是这样的:

start  counter  end  counter
t0     0        t2   2
t3     0        t4   1
t5     0        t9   4

我读过一些使用 LEAD 和 LAG 函数的解决方案,但这些在 MySQL 中不可用,而且替代实现超出了我的理解水平。我知道我可以在 Excel/Python 中进行暴力破解,但是是否有相对简单的 mySQL 查询可以完成此操作?

最佳答案

您可以使用 User-Defined Variables 在 MySQL 中模拟 LEAD 函数

举个例子

select min(time),max(time),count(*)-1
from
(
select time,counter,
if(@prev>counter,@grp:=@grp+1,@grp:=@grp),
@grp as GRPvalue,
@prev:=counter 
from t,(select @prev:=0,@grp:=0) as t1 
order by time
) t2
GROUP BY GRPValue
order by min(time)

SQLFiddle

或者这里是另一个 SQL 查询。这里我们将组定义为当前记录之前的 counter=0 的计数(如果所有间隔都从 0 开始):

select min(time),max(time),count(*)-1
from t t1
group by 
(select count(*) from t where t.time<=t1.time and counter = 0)

SQLFiddle demo

关于mysql - 基于 session 计数器配对事件并在 mySQL 中查找时间增量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18304825/

相关文章:

sql - 需要一个sql查询

mysql - 如何存储用户每个月的运行余额?

php - MySQL select parents 和 child all from on table

javascript - session 未通过 AJAX 正确发送

php - 如果用户登录到另一个网站,则自动登录到当前网站

c# - 使用 C# 将 UTF8 字符串插入 MySQL

php - 从子/子表中检索 MySQL 条目

sql - 如何从 Postgres 的预订中找到第一个免费开始时间

mysql - 包含金钱和期间的数据库表设计

Php Session和登录页面post问题