2017-07-18 16 views
0

私はSQLで時系列データをいくつか持っています。私はこのデータを「セッション化」しようとしています。新しいセッションは、n時間単位を超えるブレークが発生したときに発生します。 CSV形式でSQLで時系列データをセッション化

入力:

Time, TimeDiffFromLast 
0,0 
1,1 
2,1 
17,15 
18,1 
19,1 
32,13 
33,1 
34,1 

この例では最後の行からの時間差は、n = 10時間単位よりも大きい場合、新しいセッションが作成されるべきです。 CSV形式で

所望の出力:

Time, TimeDiffFromLast, SessionLabel 
0,0,a 
1,1,a 
2,1,a 
17,15,b 
18,1,b 
19,1,b 
32,13,c 
33,1,c 
34,1,c 

一般的にSQLでこれを行う方法はありますか?または、それは不可能であり、データを順番に繰り返す必要がありますか?

+0

セッションラベルはアルファベットでなければなりませんか?それとも数字でもありますか? –

+0

SessionLabelフィールドに一意のラベルがあれば問題ありません。例えば、私の場合はIntがおそらく理想的でしょう。 – AetherMass

答えて

1

case式を使用すると、diff> 10のときにグループの開始を指定できます。次に、実行時合計を使用してセッションラベルを分類します。

select time,diff_from_last,sum(col) over(order by time) as session_label 
from (
select time, time-lag(time,1,time) over(order by time) as diff_from_last, 
case when time-lag(time,1,time) over(order by time) > 10 then 1 else 0 end as col 
from tbl 
) t 

これは、使用しているdbmsがウィンドウ機能をサポートしていることを前提としています。

+0

私はApache Spark SQLを使用しています。あなたの上記の質問が上記のように正確に働いたことに私は驚きました。私はいくつかの構文が失われていると思った。ラグとケース機能がうまく動作します。私はそれらのビットを読み上げます。 – AetherMass

関連する問題