2016-05-25 7 views
0

時間が近すぎるイベントを見つけようとしています。これはちょうど1つのクエリで1つのpostgresクエリで、特定の時間量で2つのイベントが発生したかどうかを特定します。

ここにシナリオがあります。私はdefinitionを持ち、特定の場合に発生するeventsを持っています。useridevent 1は、特定のユーザーに対してevent 2の後1週間以内に発生してはならないとします。だから私は、あるユーザーのために、イベント1が今日発生した場合、イベント2は同じユーザーのが発生したかどうかを、1週間以内ににするかどうかを決定したいと思います。単一のSQLクエリでこれを行う方法はありますか?理想的にはそれは何かのようになります

SELECT event_id, userid as use_userid FROM events WHERE definition = 1 and date > current_date 
- interval '1 day' AND (SELECT COUNT(*) FROM events WHERE userid = use_userid 
AND definition = 2 AND date > current_date - interval '7 days') > 0 

私は閉じますか?私は、これが起こったのはどのユーザーであるかを知りたがっています。残りの情報はあまり重要ではありません。

答えて

0

lagを使用すると、行がユーザーによってパーティション化され、降順で並べ替えられた前の行の定義と日付が取得されます。次に、where条件を使用して目的の行のみを取得します。

select userid 
from (
SELECT 
userid 
,definition curr_def 
,lag(definition) over(partition by userid order by date desc) prev_def 
,date - coalesce(lag(date) over(partition by userid order by date desc), date) diffrnce 
FROM events 
) t 
where diffrnce < 7 and curr_def <> coalesce(prev_def,'xxx') 
+0

お返事ありがとうございます。私はこれを見ることでかなりのことを学びました(パーティション分割、合体、遅れ)。しかし、私はいくつかのエラーに遭遇しました( 'xxx'と間隔diffrnceを整数と比較する)。また、あなたのコードは、私が必要とするものよりも、より広範囲(そして、効率的ではない)だと思います。私は、定義の特定のペア(例えば1と2)の質問をする必要があります。あなたはあらゆるイベントのペアを選択しているようですが、私は許される時間内に多くのイベントがあります。 – helloB

0

これはあなたの目的に適していますか?

SELECT distinct userid as use_userid 
    FROM events a 
    JOIN events b using(userid) 
    WHERE a.definition = 1 and a.date > current_date - interval '1 day' 
     and b.definition = 2 and b.date > current_date - interval '7 days') > 0 
関連する問題