SQL如何计算订单购买之间的平均时间? (根据下一行和上一行进行sql计算)
Posted
技术标签:
【中文标题】SQL如何计算订单购买之间的平均时间? (根据下一行和上一行进行sql计算)【英文标题】:SQL How to calculate Average time between Order Purchases? (do sql calculations based on next and previous row) 【发布时间】:2019-06-27 18:50:58 【问题描述】:我有一个简单的表格,其中包含客户电子邮件、他们的订单数量(如果这是他们的第一个、第三个、第五个等)、创建订单的日期、该订单的价值以及总订单算上那个客户。
这是我的桌子的样子
Email Order Date Value Total
r2n1w@gmail.com 1 12/1/2016 85 5
r2n1w@gmail.com 2 2/6/2017 125 5
r2n1w@gmail.com 3 2/17/2017 75 5
r2n1w@gmail.com 4 3/2/2017 65 5
r2n1w@gmail.com 5 3/20/2017 130 5
ation@gmail.com 1 2/12/2018 150 1
ylove@gmail.com 1 6/15/2018 36 3
ylove@gmail.com 2 7/16/2018 41 3
ylove@gmail.com 3 1/21/2019 140 3
keria@gmail.com 1 8/10/2018 54 2
keria@gmail.com 2 11/16/2018 65 2
我想要做的是计算每个客户购买之间的平均时间。因此,让我们以客户 ylove 为例。首次购买时间为 2018 年 6 月 15 日。下一个是 7/16/18,即 31 天,下一次购买是 1/21/2019,即 189 天。订单之间的平均购买时间为 110 天。
但我不知道如何让 SQL 查看下一行并据此计算,但当它到达新客户时重新启动。
这是我获取该表的查询:
SELECT
F.CustomerEmail
,F.OrderCountBase
,F.Date_Created
,F.Total
,F.TotalOrdersBase
FROM #FullBase F
ORDER BY f.CustomerEmail
如果有人能给我一些建议,将不胜感激。
然后也许我可以计算价值差异(百分比)。例如,ylove 在他们的第一个订单上花费了 36 美元,在他们的第二个订单上花费了 41 美元,增长了 13%。然后他们的第二个订单是 140 美元,增长了 341%。因此,平均而言,该客户的采购订单价值增加了 177%。与 SQL 无关,但这是计算此类指标的正确方法吗?
【问题讨论】:
使用 lag() 解析函数 搜索“窗口函数”,此功能使您可以在当前行的同时使用上一行或下一行。 @Natan 。 . .您是否关心距离上次订单的时间? @GordonLinoff 你能解释一下你的意思吗?这不是我计算的吗?第一次和第二次,第二次和第三次之间的时间,然后是所有这些的平均值。 @Natan 。 . .你问的是订单之间的时间,但是自上次订单以来的时间呢。 【参考方案1】:查看您的样本,您可以尝试使用差异形式的最小和最大日期除以总数
select email, datediff(day, min(Order_Date), max(Order_Date))/(total-1) as avg_days
from your_table
group by email
也只管理一个订单
select email,
case when total-1 > 0 then
datediff(day, min(Order_Date), max(Order_Date))/(total-1)
else datediff(day, min(Order_Date), max(Order_Date)) end as avg_days
from your_table
group by email
【讨论】:
聪明,。但你不需要按总数分组 但是如果你有 2 个订单,公式应该是 (Max - Min) / (total - 1) ? 对于 3 也是总计 -1 @JuanCarlosOropeza 谢谢 .. 在某处点赞 现在不知道如何处理ation@gmail.com
只有1个订单
答案已更新。一个订单也是......总1的情况【参考方案2】:
最简单的表述是:
select email,
datediff(day, min(Order_Date), max(Order_Date)) / nullif(total-1, 0) as avg_days
from t
group by email;
你可以看到是这样的。考虑以 od1、od2 和 od3 作为订单日期的三个订单。平均值为:
( (od2 - od1) + (od3 - od2) ) / 2
检查算术:
--> ( od2 - od1 + od3 - od2 ) / 2
--> ( od3 - od1 ) / 2
这很明显可以推广到更多订单。
因此max()
减去min()
。
【讨论】:
以上是关于SQL如何计算订单购买之间的平均时间? (根据下一行和上一行进行sql计算)的主要内容,如果未能解决你的问题,请参考以下文章