2017-10-05 117 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