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

イベントは日付順またはユーザー順ではありません。

1 人のユーザーの 2 つの連続するイベント間の時間間隔 (秒単位) の最小値を調べたいと思います。したがって、結果セットは次のようになります。

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 レコード (日付順に) シフトすることで実現できます。これにより、時刻とその直前の時刻が同じ行に取得されるため、2 つの間の秒差を実現できます。

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 では、自己結合と 2 つのグループ by を使用してこれを行う必要があります。

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 に答える