2017-07-08 11 views
1

イベントタイムスタンプのリストが与えられていると、どのように「時間を費やした」と計算されますか? 「所要時間」は、各タイムスタンプ間の時間間隔の合計であり、一定の閾値を超える間隔を無視する。 1分間、その間ユーザーはおそらく非アクティブでした。SQL:効率的に時間を計算する

私はこのような何か試してみました:

select sum(finish - start) 
from (select start.time as start, 
      finish.time as finish 
     from events start, events finish 
     where start.time < finish.time and 
      finish.time - start.time < interval '1 minute' 
     group by start.time) as intervals; 

をしかし、これは非常に非効率的で終了したことがない証明しました。あなたはその方法で自分自身にイベントに参加している理由

+0

あなたはいくつかのサンプルデータをポストし、結果を期待することはできますか?それは他人があなたを素早く手助けするのを助けるでしょう。 :) –

答えて

2

用途:

SELECT SUM (time_interval_up_to_1_min) 
FROM (
    SELECT 
     CASE WHEN time - lag(time) over (ORDER BY time) 
       <= interval '1' minute 
      THEN time - lag(time) over (ORDER BY time) 
     END As time_interval_up_to_1_min 
    FROM events 
) x 

デモ:http://sqlfiddle.com/#!17/6f814/7

+0

なぜこれは結合より効率的ですか? – Will

+0

上記のクエリでは、テーブルからデータを1回だけ読み込みますが、結合ではテーブルを2回読み込み、両方のデータソースの行を結合する必要があります。 – krokodilko

1
select sum(time-lag(time) over (order by time)) from events 

は私はわからないが、クエリがないため、些細な集計で、永遠に実行されている理由は、最も可能性が高いです。

+0

"1分以上の間隔を無視する"という条件を満たしていません。しかし、はい、窓関数は答えです。 –

関連する問題