我想找出数据库中按帐户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/