2016-11-14 4 views
1

私たちは、ユーザがイベントを行うたびに記述する時系列をspark sqlテーブルに入れます。SQLでの最初の探索

しかし、ユーザーはバースト内で多くのイベントを行う傾向があります。私はこれらのバーストのすべての人のために最小時間を探したい。

これは過去のデータですので、テーブルの作成方法は変更できません。ですから、基本的にはselect min(time_), user from my_table group by userが欲しいです。どんな助けでも大歓迎です!

EDIT:

いくつかの例示的なデータは、次のようになります

user time_ 0 10 0 11 2 12 0 12 2 13 2 15 0 83 0 84 0 85

ので、例えば、私は(0,10)、(2,12)を見つけると(したい上記のデータに0,83)。 1時間以内であればバーストが発生すると言えます(上記の例のデータでは60となります)。

+1

サンプルテーブルのデータと予想される結果(書式付きテキストも含む)を追加します。 – jarlh

+1

"バースト"の定義は何ですか?あなたは固定されたウィンドウの長さを使用できますか、それとももっと複雑ですか? – Dai

+0

バーストは、すべて同じ時間内に同じユーザーが一緒に発生する多数のイベントです。私はいくつかの例のデータを今追加します –

答えて

1

これはあなたが必要な情報のみの場合:あなたは、各バーストにいくつかの追加情報を収集する必要があります場合は

select  user 
      ,time_ 

from  (select  user 
         ,time_ 
         ,case when time_ - lag (time_,1,time_-60) over (partition by user order by time_) >= 60 then 'Y' else null end as burst 

      from  my_table 
      ) t 

where  burst = 'Y' 
; 

user time_ 
0  10 
0  83 
2  12 

select  user 
      ,burst_seq 

      ,min (time_) as min_time_ 
      ,max (time_) as max_time_ 
      ,count (*) as events_num 

from  (select  user 
         ,time_ 

         ,count(burst) over 
         (
          partition by user 
          order by  time_ 
          rows unbounded preceding 
         ) + 1       as burst_seq 

      from  (select  user 
            ,time_ 
            ,case when time_ - lag (time_) over (partition by user order by time_) >= 60 then 'Y' else null end as burst 

         from  my_table 
         ) t 
      ) t 

group by user 
      ,burst_seq 
; 

user burst_seq min_time_ max_time_ events_num 

0  1   10   12   3 
0  2   83   85   3 
2  1   12   15   3 

p.s. CASE文にバグがあるようです。
case when ... then 'Y' end結果はFAILED:IndexOutOfBoundsExceptionインデックス:2、サイズ:2ですが、これは正当な構文です。
を追加すると、else nullが解決されます。

+0

素晴らしい答えと信じられないほど速い応答 - 私はあなたに1つ借りています@Dudu Markovitz –

+0

@j__、あなたは大歓迎です –

関連する問題