【问题标题】:Advanced Average Date DIfference with unique ids具有唯一 ID 的高级平均日期差异
【发布时间】:2017-10-05 14:29:07
【问题描述】:

我又回到了堆栈溢出问题,我一直在努力追根溯源,但完全没有成功。无论我使用多少次 avg(datediff) 函数。

我有一个如下的 SQL 表:

ID |个人ID |开始 |结束

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 年 3 月 21 日,最晚结束日期是 2007 年 5 月 20 日。因此,他们的逗留时间为 425 天。

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

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

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

【问题讨论】:

  • 如果您不信任您的结果,请将 datediff 的结果相加并除以聚合值的数量
  • 我不认为这是他想做的。
  • @iLikeMySql 感谢您以非常简单的方式查看它。

标签: mysql date unique average datediff


【解决方案1】:

那么为什么不试试呢:

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 中(我不知道以后的版本)。

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

【讨论】:

  • 谢谢你,这很有意义,似乎完全符合我的要求。
猜你喜欢
  • 2015-09-09
  • 1970-01-01
  • 2018-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-07
  • 2019-04-30
  • 2015-11-22
相关资源
最近更新 更多