2017-10-05 135 views
0

回到堆棧溢出時,我遇到了另一個令我頭痛的問題,那就是我一直試圖找到根本沒有成功的底線。無論我使用avg(datediff)函數多少次。高級平均日期具有唯一ID的DIfference

我有一個SQL表,如下所示:

ID | PersonID |開始|結束

1 | 1 | 2006-03-21 00:00:00 | 2007-05-19 00:00:00 |有效
2 | 1 | 2007-05-19 00:00:00 | 2007-05-20 00:00:00 |有效
3 | 2 | 2016-08-24 00:00:00 | 2016-08-25 00:00:00 |有效
4 | 2 | 2005-08-25 00:00:00 | 2016-08-28 00:00:00 |有效
5 | 2 | 2016-08-28 00:00:00 | 2017-10-05 00:00:00 |活躍

我試圖找到所有獨特人的平均活躍住宿(天)。

即基於他們的EARLIEST開始日期和最新結束日期的平均天數(因爲單個人ID可以具有多個活動狀態)。

例如,人員ID 1,他們最早的開始日期是2006-03-21,他們的最近結束日期是2007-05-20。因此他們的逗留時間爲425天。

對身份證號碼2重複此操作,他們的逗留時間爲407天。

對桌子上的每個人都這樣做後,我想要得到平均逗留時間,以上5行的平均值爲2,而唯一的人數爲416.在所有行中做一個簡單的datediff平均值我一個非常不準確的平均數爲102.

希望這是有道理的。與往常一樣,您可以給予的任何幫助非常感謝。

+0

如果您不信任您的結果,請將datediff的結果和總分值的數量相除 – iLikeMySql

+0

我不認爲這是他想要做的。 – Binarus

+0

@iLikeMySql感謝您查看它的非常簡單的方法。 – it05jb

回答

0

那麼爲什麼不嘗試:

SELECT 
    AVG(DATEDIFF(PersonEnd, PersonStart)) 
FROM 
    (SELECT 
    MIN(Start) AS PersonStart, 
    MAX(End) AS PersonEnd 
    FROM 
    table 
    GROUP BY 
    PersonID) PeriodsPerPerson 

當然,你應該有適當的索引,使MySQL能計算MAXMIN快,可以組反應同樣迅速,這意味着至少在PersonID指標,StartEnd

請注意,你確實需要內部查詢的別名,儘管我沒有在任何地方使用它。如果你離開它,你會遇到一個錯誤,至少在MySQL 5.5中(我不知道後來的版本)。

如果您擁有數百萬甚至數十億行,則最好將計算移入存儲過程或後端應用程序,而不是像上面顯示的那樣執行。

+0

非常感謝,並且看起來完全符合我的要求。 – it05jb