タイプのログがあると思います
table transaction
user; Timestamp
最初のステップは正しいシーケンスをソートすることです
select t.*,
@curRow := @curRow + 1 AS row_number
from transaction t
JOIN (SELECT @curRow := 0) r
order by user, timestamp
結果
user, timestamp, row_id
1 t1 1
1 t1+x 2
...
次のステップは、同じユーザーによる連続したアクションに参加することです
select * from
(select t.*,
@curRow := @curRow + 1 AS row_number
from transaction t
JOIN (SELECT @curRow := 0) r
order by user, timestamp) a
inner join
(select t.*,
@curRow := @curRow + 1 AS row_number
from transaction t
JOIN (SELECT @curRow := 0) r
order by user, timestamp)b
on a.user=b.user and a.row_id=b.row_id-1
結果:
user timestamp row user timestamp row
1 t1 1 1 t1+x 2
2 t1+x 2 1 t1+x+x2 3
...
イベント間の時間間隔でフィルタリングするだけです
select * from
(select t.*,
@curRow := @curRow + 1 AS row_number
from transaction t
JOIN (SELECT @curRow := 0) r
order by user, timestamp) a
inner join
(select t.*,
@curRow := @curRow + 1 AS row_number
from transaction t
JOIN (SELECT @curRow := 0) r
order by user, timestamp)b
on a.user=b.user and a.row_id=b.row_id+1
WHERE datediff(b.timestamp, a.timestamp)>120
アカウントを作成してから最初の数日以内にこれを行う必要がある場合は、トランザクション間に 120 日以上の休憩があったユーザーのリストがあります。where user in(select user from .... where datediff(min(timestamp, creation_Date)<120)
そのサブクエリでフィルター処理するために、user_id に内部結合を追加または実行するだけです。