0

我有一个 MySQL 表,记录为用户接收的事件和接收事件的日期。

Date                    User

2012-01-21 18:30:02     AAA
2012-01-21 18:30:05     AAA
2012-01-21 18:30:08     AAA
2012-01-21 18:30:11     AAA
2012-01-21 18:30:15     AAA
2012-01-21 18:30:18     AAA
2012-01-21 18:30:21     AAA
2012-01-21 18:30:23     AAA
2012-01-21 18:30:26     AAA
2012-01-21 18:30:29     BBB
2012-01-21 18:30:32     BBB
2012-01-21 18:30:33     BBB
2012-01-21 18:30:37     BBB
2012-01-21 18:30:40     BBB
2012-01-21 18:30:42     BBB
2012-01-21 18:30:44     BBB
2012-01-21 18:31:01     BBB
2012-01-21 18:31:04     BBB
2012-01-21 18:31:07     BBB
2012-01-21 18:31:10     BBB

事件不按日期或用户排序。

我想找出单个用户的两个连续事件之间的最小时间间隔(以秒为单位)。所以结果集看起来像这样:

MIN_INTERVAL        USER

3                   AAA
5                   BBB

谁能帮我想出一个生成这个的 SQL 查询?我认为 GROUP BY 不会有帮助。

4

3 回答 3

1

简单版可能不是最快的?

SELECT t1.user, MIN(TIMESTAMPDIFF(SECOND, t1.date, t2.date))
FROM tbl AS t1
JOIN tbl AS t2 ON t1.user = t2.user
WHERE t1.date < t2.date
GROUP BY t1.user
于 2012-07-20T02:17:42.937 回答
1

这可以通过将自连接移动 1 条记录(按日期顺序)来完成,这将获得时间和它们之前的时间到同一行,这样我们就可以在两者之间做几秒钟的差异:

SELECT 
    a.user,
    MIN(TIMESTAMPDIFF(SECOND, b.date, a.date)) AS mindiff
FROM
(
    SELECT user, date, @val1:=@val1+1 AS rn
    FROM tbl
    CROSS JOIN (SELECT @val1:=0) AS val1_init
    ORDER BY date
) a
INNER JOIN
(
    SELECT user, date, @val2:=@val2+1 AS rn
    FROM tbl
    CROSS JOIN (SELECT @val2:=1) AS val2_init
    ORDER BY date
) b ON a.rn = b.rn
GROUP BY a.user

SQLFiddle 演示


中间结果(之前GROUP BY

于 2012-07-20T02:03:08.403 回答
0

在 mysql 中,您需要使用自连接和两个 group bys 来执行此操作:

select t.user, min(diff)
from (select t.user, unix_timestamp(tnext.date) - unix_timestamp(t.date) as diff
      from t join
           tnext
           on t.user = tnext.user and
              t.date < tnext.date
      group by t.user, t.date
     ) t
group by user

内部子查询查找下一次并减去这些值以获得差异。外部返回最小的差异。

于 2012-07-20T01:55:40.497 回答