SQL如何计算两次定购之间的平均时间? (根据下一行和上一行进行sql计算)

时间:2019-06-27 18:50:58

标签: sql sql-server date

我有一个简单的表,其中包含客户电子邮件,他们的订单数(因此,如果这是他们的第一笔订单,第三笔订单,第五笔订单等),订单的创建日期,该订单的价值以及总订单为那个客户计数。

这是我的桌子的样子

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

我想做的是计算每个客户购买之间的平均时间。因此,让我们来吸引客户。首次购买日期为6/15/18。下一个是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无关,但这是计算指标的正确方法吗?

2 个答案:

答案 0 :(得分:2)

寻找样品,您可以尝试使用差异形式的最小和最大日期除以总计

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

答案 1 :(得分:1)

最简单的公式是:

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()