1

ロジックを説明しようと思います。うまくいけば、誰かが私を理解して助けてくれることを願っています。

事実上、最初にアカウントを作成してから最初の 120 日以内に取引を停止したが、最後の取引から 120 日間非アクティブな人をデータベース内で探しています。

基本的に、誰かが 120 日間取引を停止し、3 年後に再び取引を行う場合、このリストに該当する必要があります。したがって、使用してmax(transaction.created_at)も機能しません。

うまくいけば、私は自分自身を正しく説明しました。

4

1 に答える 1

1

タイプのログがあると思います

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 に内部結合を追加または実行するだけです。

于 2013-10-08T09:02:08.733 に答える