Как рассчитать среднее время между интервалами в SQL? - PullRequest
2 голосов
/ 08 сентября 2011

У меня есть таблица SQL, где мне нужно определить среднее время после каждой транзакции:

Данные выглядят так:

Tran1 07/09/2011 09:09:07  - CUSTOMER1 
Tran2 07/09/2011 09:30:46  - CUSTOMER1 
Tran3 07/09/2011 11:27:01  - CUSTOMER2 
Tran4 07/09/2011 11:29:22  - CUSTOMER2 
Tran5 07/09/2011 13:23:48  - CUSTOMER1 
Tran6 08/09/2011 14:21:29  - CUSTOMER3 
Tran7 08/09/2011 14:25:23  - CUSTOMER3 
Tran8 10/09/2011 13:28:57  - CUSTOMER1 
Tran9 10/09/2011 13:30:21  - CUSTOMER1 
Tran10 10/09/2011 13:49:13 - CUSTOMER4

Таблица является таблицей транзакций и имеет три столбца: -

ID = Уникальный идентификатор, TimeStamp = DataTime, CustomerId = Уникальный идентификатор

Так что, если я передам параметр DateTime .. скажем, '10 / 09/2011 ' Результат, которого я пытаюсь достичь, это ..

Дата: 09.10.2011 AverageQueueTime: 3mins2secs - для примера

Ответы [ 3 ]

2 голосов
/ 08 сентября 2011

С таким запросом (не проверено)

select t.customerID, TIMESTAMPDIFF(SECOND, MIN(t.timestamp), MAX(t.timestamp) ) / (COUNT(DISTINCT(t.timestamp)) -1)  as AverageTime
from Transaction_Table T
group by T.customerID

даст вам результат в считанные секунды. Посмотрите на этот ответ для лучшего объяснения

0 голосов
/ 11 ноября 2014

Модифицированная версия решения iridio для

a) Запрос версии базы данных SQL Server b) Поддержка нулевых значений

select t.customerID,
       Case When COUNT(DISTINCT(t.timestamp)) < = 1 THEN 0
             ELSE DATEDIFF(SECOND,MIN(t.timestamp),MAX(t.timestamp))
                   /(COUNT(DISTINCT(t.timestamp)) -1)  as AverageTime
 from Transaction_Table T
 group by T.customerID

Примечание: Данные должнысортировать по отметке времени, иначе вы получите неправильные результаты.

0 голосов
/ 08 сентября 2011

Предполагается, что ваша таблица называется «MyTable» (действительно ли она называется «Транзакция !?») и вам нужна разница в минутах:

SELECT  CustomerID ,
        SUM(timeSinceLastTransaction) / COUNT(*)
FROM    ( SELECT    * ,
                    DATEDIFF(MINUTE,
                             ( SELECT TOP 1
                                        t2.DataTime
                               FROM     MyTable t2
                               WHERE    t2.DataTime < t1.DataTime
                                        AND t2.CustomerId = t1.CustomerId
                               ORDER BY t2.DataTime DESC
                             ),
                             t1.DataTime
                             ) AS timeSinceLastTransaction
          FROM      MyTable t1
        ) AS IndividualTimes

Это коррелированный подзапрос.

...