2

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

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

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

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

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

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

4

1 回答 1

0

您可以使用用户定义的变量在 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 查询。在这里,我们将 group 定义为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 演示

于 2013-08-19T14:11:29.170 回答