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

Advanced Average Date DIfference with unique ids

我又回到了堆栈溢出问题,我一直试图弄清这个问题的根源,但没有成功。无论我使用 avg(datediff) 函数多少次。

我有一个 SQL table 如下所示:

编号 |人号 |开始|结束

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 |活跃

我试图找出所有 唯一 人的平均活跃停留时间(以天为单位)。

即基于最早开始日期和最晚结束日期的平均天数(因为一个人 ID 可以有多个活动状态)。

例如,ID 1 的人员,其最早开始日期为 2006-03-21,最晚结束日期为 2007-05-20。他们因此停留了425天。

对 ID 号 2 重复此操作,他们的逗留时间为 407 天。

为 table 上的每个人完成此操作后...我想获得平均停留时间,上面 5 行的平均值,有 2 个不同的人是 416。做一个简单的 datediff 平均值所有行都会给我一个非常不准确的平均值 102。

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

为什么不试试呢:

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

当然,你应该有适当的索引,这样 MySQL 可以快速计算 MAXMIN 并且也可以快速分组,这意味着索引至少在 PersonIDStartEnd.

请注意,您确实需要内部查询的别名,尽管我没有在任何地方使用它。如果你离开它,你会 运行 出错,至少对于 MySQL 5.5(我不知道更高版本)。

如果您有数百万甚至数十亿行,最好将计算转移到存储过程或后端应用程序中,而不是像上面那样进行。