2016-02-05 66 views
1

我是MS SQL新手,我很難獲得正確的結果。我目前有一個表格,其中包含標題updateddate(日期),addedby(編號),operationid(編號)和servicereqno(編號),這些表格已從三個不同的表中選擇。同一列中的事件之間的日期差異

operationid是一個事件,servicereqno是一個工作號碼。我希望能夠獲得事件之間的時間差,然後一旦建立,就可以計算出平均值。

例如:

  • OPID 512是在20:15 - servicereqno 1
  • OPID 535是在21:23 - servicereqno 1

我的首要任務將是確定什麼時間上的差異在於,確保它在同一個工作號碼內。

非常感謝

+0

這是現在我輸入的語法,但它不工作:第一站現在是基於高亮顯示的區域,它表示是一個'無效的對象名'我不明白爲什麼這是無效的,當它是對象名: – AJ1791

+0

選擇CHANGE.UPDATEDDATE,CHANGE.ADDEDBY,S_OPERATION.OPERATIONID,CHANGE.SERVICEREQid 從變更INNER JOIN CHANGE_H ON CHANGE.SERVICEREQNO = CHANGE_H.SERVICEREQNO INNER JOIN S_OPERATION ON CHANGE_H.OPERATIONID = S_OPERATION.OPERATIONID WHERE(S_OPERATION。 OPERATIONID = 102005212)或 (S_OPERATION.OPERATIONID = 102005218)或 (s_operation.operationid = 102005406)或(s_operation.operationid = 102005401)或 (s_operation.operationid = 102005215); WITH cteOps AS( – AJ1791

+0

SELECT row_number()OVER(PARTITION BY change.servicereqno ORDER BY change.updateddate)seqid,change.updateddate,change.servicereqno FROM ** CHANGE.updateddate,change.addedby,s_operation.operationid,change.servicereqno) ** SELECT DATEDIFF(毫秒,o1.updateddate,o2.updateddate)updateddatediff,servicereqno FROM cteOps o1 JOIN cteOps o2 ON o1.seqid = o2.seqid + 1 AND o1.servicereqno = o2.servicereqno; – AJ1791

回答

0

SQL Server提供了a built-in DATEDIFF function,你可以用它來找到兩個日期之間的差值。此外,SQL Server有a built-in AVG function,您可以使用它來計算一組值的平均值。

+0

我認爲這並沒有真正回答這個問題,因爲它忽略瞭如何真正獲得事件之間的持續時間。 – Lucero

+0

在我看來,問題是關於如何區分兩次之間的差異。問題的標題是「同一列中的事件之間的日期差異」,並且帖子以「我的第一個任務將確定時間差異是什麼」結束。 'DATEDIFF'功能可以實現這個功能。我會編輯我的答案,使其更清楚。 –

+0

丹,重點是「在同一列」 - 如何將'DATEDIFF()'應用到多行? – Lucero

1

爲了獲得事件之間的時間間隔,您需要按順序對所有操作進行編號(一次增加而不剩),然後加上它自己的偏移量爲1.你會得到n-1行,其結果是時間間隔。

事情是這樣的:

WITH cteOps AS (
    SELECT ROW_NUMBER() OVER (PARTITION BY servicereqno ORDER BY updateddate) seqid, updateddate, servicereqno 
    FROM yourdatasource 
) 
SELECT DATEDIFF(millisecond, o1.updateddate, o2.updateddate) updateddatediff, servicereqno 
    FROM cteOps o1 
    JOIN cteOps o2 ON o1.seqid=o2.seqid+1 AND o1.servicereqno=o2.servicereqno; 

當然你也可以在執行聚集,以獲得平均或任何你需要的。

+0

OP的問題有點含糊不清,但我認爲你需要一個ROWNUMBER()OVER(通過servicereqno ORDER BY updateddate分區)AS seqid'。否則,你正在比較不同的servicereqno ......無論如何,正如我所說,OP的問題在這個問題上有點太模糊。 –

+0

@TT,是的,在這一點上是模糊的。我最初只是爲了簡單而離開了它,但現在我已經按照建議編輯了代碼,並且還將'servicereqno'添加到'JOIN',以便它返回正確的結果。 – Lucero

+0

感謝您的反饋,作爲新的這一點,我不確定爲什麼這不適合我,我越來越ROWNUMBER和結束是無效的ROW_NUMBER是,但我不知道該怎麼改變OVER。 – AJ1791