У меня есть таблица, которая отслеживает взаимодействие пользователя с записью клиента. Я хочу отслеживать продолжительность каждого «касания» пользователем, то есть количество времени, затрачиваемого каждым пользователем, каждый раз, когда нам требуется доступ к записи клиента. У меня есть основы, используя ROW_NUMBER() OVER (PARTITION BY | ORDER BY). Проблема, из-за которой я не могу раздобыть мозг гороха, заключается в том, как разделить два разных пользовательских касания, когда эти штрихи являются последовательными, но разделяются значительным количеством времени. Я не знаю, что я объяснил, что ясно, но приведенные ниже примеры следует уточнить:t-sql последовательная продолжительность
Ниже приведен пример данных, которые я могу запросить успешно:
DATE TIME USER
11/17/2011 1:30:47 ZDBatch
11/17/2011 1:32:40 ZDBatch
12/13/2011 10:39:46 EMSZC27
12/13/2011 10:45:48 EMSZC27
Нужный набор результатов
DURATION (MIN) USER
1.883 ZDBatch
6.033 EMSZC27
и достигается с помощью следующего запроса (обратите внимание, что я оставил некоторые столбцы из приведенного выше примера):
; WITH CTE1 AS
(
SELECT ROW_NUMBER() OVER (PARTITION BY thr.[tdate], thr.[job], thr.[who], thr.[moddate] ORDER BY thr.[moddate]) AS RowNo,
thr.[tdate], thr.[job], thr.[moddate], thr.[modtime], thr.[seq], thr.[who],
thr.[description], thr.[histtype], thr.[attachment], thr.[data1], thr.[data2]
FROM Trip_History_Reporting thr
WHERE thr.[tdate] = '2011-10-24' --AND thr.[job] IN ('0653-A', '0128-A')
AND LEFT(thr.[description], 8) <> 'Recalled'
AND (LEFT(thr.[who],5) = 'EMSZC' OR thr.[who] = 'ZDBatch')
--ORDER BY thr.[moddate], thr.[modtime]
)
SELECT tdate, job, MIN(RowNo), MAX(RowNo), MIN(modtime) AS [Start], MAX(modtime) AS [End],
CAST(CAST(DATEDIFF(SECOND, MIN(modtime), MAX(modtime)) AS DECIMAL(6,0))/60 AS DECIMAL(8,2)) AS [Duration (Min)],
who, moddate
FROM CTE1
GROUP BY tdate, job, who, moddate
Ниже приведен пример данных, которые я не могу запросить успешно (последовательные отдельные штрихи и тем же пользователем):
DATE TIME USER
11/1/2011 6:34:48 EMSZC34
11/1/2011 6:35:08 EMSZC34
11/1/2011 6:35:08 EMSZC34
11/1/2011 6:35:08 EMSZC34
11/1/2011 6:35:08 EMSZC34
11/1/2011 6:35:08 EMSZC34
11/15/2011 11:08:32 EMSZC34
11/15/2011 11:09:14 EMSZC34
11/15/2011 11:09:14 EMSZC34
11/15/2011 11:09:14 EMSZC34
11/15/2011 11:09:14 EMSZC34
11/15/2011 11:09:14 EMSZC34
Проблема возникает тогда, когда «значительное» количество времени проходит между концом первого прикосновения и начало второго прикосновения (ради аргумента, если час проходит между касаниями, это разные штрихи).
Нужный набор результатов из приведенных выше данных является
DURATION (MIN) USER
0.333 EMSZC34
0.7 EMSZC34
Это кажется настолько простым, но я не могу понять это. Заранее благодарим за любые идеи, предложения, прямое издевательство над моей щедростью.
Приносим извинения за задержку в ответе. Я понимаю, что эта группа оказывает бесплатную помощь, и я не собираюсь использовать ее, не отвечая быстро. Я сделаю все возможное, чтобы это не повторилось.
В соответствии с просьбой EricZ, вот это пример с желаемым выходом:
DATE TIME USER
11/1/2011 6:34:48 EMSZC34
11/1/2011 6:35:08 EMSZC34
11/1/2011 6:35:08 EMSZC34
11/1/2011 6:35:08 EMSZC34
11/1/2011 6:35:08 EMSZC34
11/1/2011 6:35:08 EMSZC34
11/15/2011 11:08:32 EMSZC34
11/15/2011 11:09:14 EMSZC34
11/15/2011 11:09:14 EMSZC34
11/15/2011 11:15:24 EMSZC34
11/15/2011 11:26:38 EMSZC34
11/15/2011 11:34:55 EMSZC34
11/15/2011 11:36:22 EMSZC34
Желаемый результат:
DURATION (MIN) USER
0.333 EMSZC34
27.833 EMSZC34
Заранее спасибо за любую помощь вы можете предоставить. Я изучал острова и пробелы в попытке решить эту дилемму, но я до сих пор не могу понять это.
Спасибо , Это близко, но не совсем то, что я ищу. Вина моя, поскольку приведенные мною примеры не содержат достаточной информации. Этот запрос работает с примерами, которые были опубликованы, но не работает, если данные более подробные. Например, используя второй пример данных из моего исходного сообщения, измените время на последних четырех строках на 11:15:24, 11:26:38, 11:34:55 и 11:36:22. Теперь запустите этот запрос, и вы увидите, что он вычисляет разницу во времени между строками A и B, затем B и C, затем C и D ... – Kris
@ Kris, каков ваш ожидаемый результат в этом случае? Не могли бы вы обновить свой вопрос? – EricZ
Эрик. Я обновил вопрос вторым примером, как описано выше. В вашем удобстве, пожалуйста, просмотрите. Прошу прощения за задержку в ответе. – Kris