1

ユーザーとボット (基本的にはステート マシン) の間のすべてのメッセージを格納するテーブルがあり、各ユーザーの平均応答時間を計算するために、このテーブルからメッセージ/応答のすべてのペアを見つけようとしています。注意点は、すべての送信メッセージが応答を受け取るわけではないということです。

各行には、message_id、user_id、created_at (タイムスタンプ)、state_code、および発信 (ブール値) が格納されます。

ラグとリードを使用して関連するメッセージのペアを見つけ、作成された値の差を計算することを意図して、ウィンドウ関数を見てきました。各ユーザーの平均は、各ユーザーの平均を示します。反応時間。これの問題は、両方のメッセージが同じ sate_code で発行されたことを保証する方法がないことです。アイデア?

更新:ユーザーのメッセージが同じ状態コードを持っている場合、ユーザーのメッセージが特定の送信メッセージへの応答であることを保証できます。たとえば、

╔════════════╦═════════╦════════════╦════════════╦══════════╗
║ message_id ║ user_id ║ created_at ║ state_code ║ outgoing ║
╠════════════╬═════════╬════════════╬════════════╬══════════╣
║          1 ║      11 ║ mm/dd/yy   ║         20 ║ t        ║
║          2 ║      11 ║ mm/dd/yy   ║         20 ║ f        ║
║          3 ║      11 ║ mm/dd/yy   ║         22 ║ t        ║
║          4 ║      11 ║ mm/dd/yy   ║         21 ║ t        ║
║          5 ║      12 ║ mm/dd/yy   ║         45 ║ t        ║
║          6 ║      12 ║ mm/dd/yy   ║         46 ║ f        ║
║          7 ║      12 ║ mm/dd/yy   ║         46 ║ t        ║
║          8 ║      12 ║ mm/dd/yy   ║         20 ║ f        ║
║          9 ║      12 ║ mm/dd/yy   ║         43 ║ t        ║
║         10 ║      13 ║ mm/dd/yy   ║         20 ║ t        ║
╚════════════╩═════════╩════════════╩════════════╩══════════╝

この場合、ペアはメッセージ 1 と 2、およびメッセージ 6 と 7 です。ただし、ユーザー 1 は状態 20 で受信した送信メッセージの 1 つに状態 20 から応答しているため、メッセージ 1 と 2 のみが重要です。

4

1 に答える 1

2

私が正しく理解していれば、outgoingが false になるたびにcreated_at、前の行から同じuser_idとが必要になりstate_codeます。

これにWindows関数をどのように使用するかわかりません。相関サブクエリを使用したアプローチを次に示します。

1 つの方法を次に示します。

select t.*,
       (select created_at
        from t t2
        where t2.user_id = t.user_id and
              t2.state_code = t.state_code and
              t2.outgoing = 't' and
              t2.created_at < t.created_at
        order by t2.created_at desc
        limit 1
       ) as prev_created_at
 from t

その後、日付演算を実行して、必要なものを取得できます (ほとんどの場合はそうでprev_created_atはありませんNULL)。

前の行が「直前の行」であることがわかっている場合は、次のようにして同様のことができますlag()

 select t.*
 from (select t.*,
              lag(created_at) over (partition by user_id, state_code order by created_at) as prev_created_at,
              lag(outgoing) over (partition by user_id, state_code order by created_at) as prev_outgoing
       from t
      ) t
where t.outgoing = 'f' and t.prev_outgoing = 't';
于 2013-07-11T00:15:31.967 に答える