2016-08-24 6 views
1

セッションの長さを調べて、ユーザーが連続して数分間ログインした時間を確認しようとしています。問題は、セッションがアクティビティによって行に分割されることです。アクティビティの終了が次のアクティビティの開始と同じである場合、それらは同じセッションの一部であり、一緒に数える必要があります。sqlの複数の行で連続セッションをグループ化する

理想的には、それは次のようになり、私はACTIVITY_STARTとACTIVITY_ENDを持っているし、セッションを作成したいと思います:

ACTVITY_START | ACTIVITY_END | SESSION 
----------------|-----------------|---------- 
2/16/2016 19:00 | 2/16/2016 20:51 | 1 
2/16/2016 20:51 | 2/16/2016 20:52 | 1 
2/16/2016 20:52 | 2/16/2016 20:54 | 1 
2/16/2016 20:54 | 2/16/2016 21:25 | 1 
2/16/2016 21:25 | 2/16/2016 21:26 | 1 
2/16/2016 21:26 | 2/16/2016 22:13 | 1 
2/16/2016 22:13 | 2/16/2016 22:14 | 1 
2/16/2016 22:14 | 2/16/2016 22:41 | 1 
2/18/2016 21:59 | 2/18/2016 23:07 | 2 
2/18/2016 23:07 | 2/19/2016 0:00 | 2 
2/19/2016 0:00 | 2/19/2016 1:56 | 2 
2/19/2016 1:56 | 2/19/2016 1:58 | 2 
2/19/2016 19:08 | 2/19/2016 20:53 | 3 
2/19/2016 20:53 | 2/20/2016 0:00 | 3 
2/20/2016 0:00 | 2/20/2016 0:05 | 3 
2/20/2016 0:05 | 2/20/2016 2:00 | 3 
2/20/2016 2:00 | 2/20/2016 2:12 | 3 
2/20/2016 2:12 | 2/20/2016 2:28 | 3 
2/20/2016 2:28 | 2/20/2016 2:32 | 3 
2/20/2016 12:38 | 2/20/2016 14:16 | 4 
2/20/2016 14:26 | 2/20/2016 14:27 | 5 

もともと私がやったことは、同じ行の次の活動開始と活動終了までのラインでした:

SELECT DENSE_RANK() OVER (ORDER BY CASE WHEN A.ACTIVITY_END = B.ACTIVITY_START THEN 0 ELSE 1 END) 

しかし、セッションが変更されると、すべてのセッションが常に別々にランク付けされます。

セッションを開始するたびにSESSIONが増分されるようにするにはどうすればよいですか?

答えて

1

質問をMySQLデータベースとしてタグ付けしても、dense_rank()ウィンドウ関数を使用して「成功」クエリを実行したということは、間違いなくMySQLであることを示しています。 MySQLは現在、ウィンドウ関数をサポートしていません。

あなたのデータベースがどんなものであれ、それが窓関数をサポートしているという事実に基づいて、私は先に進み、窓関数のとsumのサポートを含むと仮定します。そのような場合は、関数を使用して、前の行の続きではない行を特定することができます。そして、あなたはlag関数によって生成された値に基づいて、セッションIDを生成するための累積和を使用することができます。

with cte as (
    select a.*, 
     case when a.activity_start = lag(a.activity_end) over (order by a.activity_start) 
       then 0 else 1 end as grp_id 
    from activity a 
) 
select activity_start, 
     activity_end, 
     sum(grp_id) over (order by activity_start) as session_id 
    from cte 
    order by activity_start 
+0

はそれは申し訳ありませんが、Netezzaのデータベースです。 – user6745154

+0

ドキュメントによると、Netezzaは 'lag'と' sum'ウィンドウ関数の両方をサポートしています。だから私の答えはうまくいくはずです。最悪の場合、構文の微妙な調整が必要な場合がありますが、一般的な考え方は良いはずです。 – sstan

+1

私はいくつかの調整をする必要があったが、あなたの考えは完璧に働いた。ありがとう! – user6745154

関連する問題