我想找出数据库中按帐户id分组的订单之间的平均天数。
假设我有一个名为“orders”的表,其中包含这些数据。

id  account_id  account_name    order_date
1   555         Acme Fireworks  2015-06-15
2   342         Kent Brewery    2015-09-12
3   555         Acme Fireworks  2015-09-15
4   342         Kent Brewery    2015-10-12
5   342         Kent Brewery    2015-11-12
6   342         Kent Brewery    2015-12-12
7   555         Acme Fireworks  2015-12-15
8   900         Plastic Inc.    2015-12-20

我希望查询产生以下结果
account_id  account_name    average_days_between_orders
342         Kent Brewery    30.333
555         Acme Fireworks  91.5
900         Plastic Inc.    (unsure of what value would go here since there's 1 order only)

我检查了下面的问题以获得一个想法,但仍然无法找出问题所在:
Average difference between two dates, grouped by a third field?
谢谢!

最佳答案

您需要一个查询,该查询生成给定的上一次购买之间的差异(如果没有上一次购买,则为空),并取这些值的平均值。
我将加入上面的表格,为每个订单获取一个子查询中的所有订单的最大订单日期。在avg()函数中,计算计算日期和当前订单日期之间的差异:

SELECT o3.account_id, o3.account_name, avg(diff) as average_days_between_orders
FROM
    (select o1.id,
            o1.account_id,
            o1.account_name,
            datediff(o1.order_date, max(o2.order_date)) as diff
     from orders o1
     left join orders o2 on o1.account_id=o2.account_id and o1.id>o2.id
     group by o1.id, o1.account_id, o1.account_name, o1.order_date) o3
GROUP BY o3.account_id, o3.account_name

作为联接的替代方法,可以使用子查询中的用户定义变量或选择列表中的相关子查询来计算差异。您可以检查mysql运行的total解决方案来了解这个解决方案,例如this SO topic。具体来说,查看solution provided by Andomar
如果您的orders表很大,那么从性能的角度来看,该主题中描述的替代aproaches可能更好。

关于mysql - 如何获取MYSQL中同一列中多个日期之间的平均天数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36721644/

10-15 07:55