2017-02-22 4 views
2

мне нужно запустить некоторый запрос к каждому набору строк в таблице (Azure 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 

То, что я хочу сделать, это извлечь «сеанс чата» для каждого клиента из записей сообщений, то есть, если разрыв между двумя двумя последовательными сообщениями составляет менее 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

Смежные вопросы