具有唯一ID的高级平均日期差异

时间:2017-10-05 14:29:07

标签: mysql date unique average datediff

我回到了堆栈溢出的另一个令我头疼的问题,我一直试图找到底线,但根本没有成功。无论我使用avg(datediff)函数多少次。

我有一个如下所示的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开始日期和LATEST结束日期的平均天数(因为单个人ID可以具有多个活动状态)。

例如,人ID 1,他们最早的开始日期是2006-03-21,他们的最后结束日期是2007-05-20。因此,他们的逗留时间为425天。

对于身份证号码2重复此操作,他们的逗留时间为407天。

在为桌面上的每个人做这个之后...我想得到平均逗留时间,上面5行的平均值,2个独特的人是416.在所有行中做一个简单的约会平均值会给我一个非常不准确的平均值102。

希望这是有道理的。一如既往,非常感谢您给予的任何帮助。

1 个答案:

答案 0 :(得分: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,{{1 }和Start

请注意,您确实需要内部查询的别名,尽管我不会在任何地方使用它。如果你放弃它,你会遇到一个错误,至少在MySQL 5.5中(我不知道更新的版本)。

如果你有数百万甚至数十亿行,你可能最好将计算转移到存储过程或后端应用程序,而不是如上所示。