代码之家  ›  专栏  ›  技术社区  ›  it05jb

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

  •  0
  • it05jb  · 技术社区  · 7 年前

    我带着另一件头痛的事又回来了,我一直在努力弄清真相,但一点也没有成功。无论我使用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 |活动

    我试图找到所有人的平均活动时间(天) 唯一的

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

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

    希望这有意义。一如既往,我们非常感谢您提供的任何帮助。

    1 回复  |  直到 7 年前
        1
  •  0
  •   Binarus    7 年前

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

    当然,您应该有适当的索引,以便MySQL可以计算 MAX MIN PersonID , Start End .

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

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