SELECT userID, status, TIMESTAMPDIFF(minute, MIN(tStamp), MAX(tStamp)) AS duration
FROM (
SELECT
t.*
, @groupNumber := IF(@prev_userID != userID OR @prev_status != status, @groupNumber + 1, @groupNumber) AS gn
, @prev_userID := userID
, @prev_status := status
FROM t
, (SELECT @groupNumber := 0, @prev_userID := NULL, @prev_status := NULL) var_init_subquery
ORDER BY userID, tStamp
) sq
GROUP BY gn, userID, status
这是它的工作原理。我们定义了三个变量。一个保存组号,另外两个保存前一行的status和userId的值。请注意,在关系数据库中,除非您指定顺序,否则没有顺序。这一点非常重要。在select子句中,我们首先检查变量值是否与当前行不同。如果是,则增加组号;如果不是,则保持不变。之后,我们赋值给当前行的值。因此,当下一行被处理时,变量仍然保存着前一行的值。所以顺序在这里也很重要。在外部查询中,我们只需按照这个组号进行分组,就可以得到时间戳的最小值和最大值。
@变量。 - Rick James