2011-09-08 102 views
2

我有一個SQL表,我需要每個交易後製定出的平均時間:如何計算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 = UniqueID的,時間戳= DATATIME,客戶ID = UniqueID的

所以,如果我通過在一個參數d ateTime ..讓說,'10/09/2011' 結果我試着去實現的是..

日期:2011年10月9日AverageQueueTime:3mins2secs - 爲〔實施例

+0

'CustomerID'看起來不是'UNIQUE' ... –

+0

那3分鐘到2秒是如何計算的? –

回答

0

假設您的表名爲「MyTable的「(它真的命名爲Transaction !?),並且您希望在幾分鐘內獲得差異:

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 

這是一個相關的子查詢。

+0

謝謝我已經試過這個,但沒有運氣,我得到這個錯誤信息 - 「datediff函數需要3個參數。」 – user929153

+0

編輯修復:添加t1.DataTime作爲DateDiff的第三個參數。 –

+0

謝謝。這現在對我來說很有效。然而...我試圖找出每個客戶交易和我需要做的事情之間的平均時間是傳遞給定的日期,所以如果我通過'10/9/2011'它應該查詢表並返回給我平均排隊時間。返回結果應該看起來像..日期:10/9/2011平均時間:3分鐘2秒。 – user929153

2

有了這樣的查詢(未測試)

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 

會給你在幾秒鐘的結果。看看this answer一個更好的解釋

+0

用於計算連續值/範圍的平均值的鏈接中的滑動技巧。我喜歡這種方法比我的更好。不太人性化,更加資源友好。 –

+1

你如何解釋零分? –

+1

使用case語句:計數(ID)= 0時的情況,0 else Datediff()結束 – Iridio

0

修改了iridio解決方案的版本

一)查詢的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 

注:數據應該按時間戳排序,否則你會得到錯誤的結果。