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计算)的主要内容,如果未能解决你的问题,请参考以下文章

如何按日期顺序计算日期之间的平均天数

SQL 他们的第一个订单和第二个订单的购买价值之间的差异

SQL - 计算产品的累积平均成本价

sql 使用计算成员的每个订单的平均销售金额

用Python分析用户消费行为

如何计算 SQL Server 中按日期和用户分组的条目之间的平均时间?