2017-02-22 11 views
2

個別テーブルの各部分にクエリを適用します。は、私はテーブル(アズールSQL)の各行セットに対していくつかのクエリを実行する必要が

ID CustomerID  MsgTimestamp   Msg 
------------------------------------------------- 
1  123   2017-01-01 10:00:00  Hello 
2  123   2017-01-01 10:01:00  Hello again 
3  123   2017-01-01 10:02:00  Can you help me with my order 
4  123   2017-01-01 11:00:00  Are you still there 
5  456   2017-01-01 10:07:00  Hey I'm a new customer 

私が何をしたいことはすべての顧客のために「のチャットセッション」を抽出することですメッセージレコードから、つまり、2つの連続するメッセージ間のギャップが30分未満の場合、それらは同じセッションに属します。新しいテーブルに各セッションの開始時刻と終了時刻を記録する必要があります。上記の例では、顧客123の最初のセッションの開始時刻と終了時刻は10:00と10:02です。

私はいつもその目標を達成するためにカーソルと一時テーブルを使用することができますが、私はより良いパフォーマンスに達するために事前構築されたメカニズムを利用することを考えています。親切に私にいくつかの情報を与えてください。

答えて

1

カーソルの代わりにウィンドウ関数を使用できます。このような何か作業をする必要があります:

declare @t table (ID int, CustomerID int, MsgTimestamp datetime2(0), Msg nvarchar(100)) 
insert @t values 
(1,  123,   '2017-01-01 10:00:00',  'Hello'), 
(2,  123,   '2017-01-01 10:01:00',  'Hello again'), 
(3,  123,   '2017-01-01 10:02:00',  'Can you help me with my order'), 
(4,  123,   '2017-01-01 11:00:00',  'Are you still there'), 
(5,  456,   '2017-01-01 10:07:00',  'Hey I''m a new customer') 

;with x as (
    select *, case when datediff(minute, lag(msgtimestamp, 1, '19000101') over(partition by customerid order by msgtimestamp), msgtimestamp) > 30 then 1 else 0 end as g 
    from @t 
), 
y as (
    select *, sum(g) over(order by msgtimestamp) as gg 
    from x 
) 
select customerid, min(msgtimestamp), max(msgtimestamp) 
from y 
group by customerid, gg 
+0

とてもクール!私は以前はウィンドウ関数を使用していましたが、実装する方法を正確にはわかりません。あなたの "セッションマーカー"(列gとgg)の使用は素晴らしいです! – Ryan

関連する問題