SQL 计算一阶和二阶之间的平均时间? (根据 min 和 min+1 进行 sql 计算?)

SQL Calculate Average time between first and second order? (do sql calculations based on min and min+1?)

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

这是我的 table 的样子

Email          Order# Date     Value TotalOrders
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

首先我计算了所有订单之间的平均时间,采用最小订单数据和最大订单日期,并使用订单量计算它们之间的平均值。

我是这样做的(在一些 SO 用户的帮助下):

select email,
       datediff(day,  min(Date), max(Date)) / nullif(total-1, 0) as AvgDays
from Table
group by email;

这给了我每个客户购买天数之间的平均值。然后我加入 table 作为原始 table 的子查询,并在客户电子邮件中加入它。

现在我想要的是每个客户,从第一个订单到第二个订单所花费的天数(如果没有第二个订单,则为 0 或 null),以及从第二个订单到第二个订单所花费的天数第三个(同样如果没有第三个顺序)

所以它与我上面的查询几乎完全一样,但不是对最小值和最大值执行 datediff,而是对 min 和 min 加 1 进行 datediff。或者 min 加 1 和 min 加 2。等等上。

这可能吗?

或者我可以做一些 case 语句 where Order# =2..

此外,如果这太难了,我不需要递归地执行此操作,只需前三个命令就足够了。

您可以使用条件聚合来做到这一点:

select email,
       datediff(day, min(Date), max(Date)) / nullif(total-1, 0) as AvgDays,
       datediff(day,
                 max(case when seqnum = 1 then date end),
                 max(case when seqnum = 2 then date end)
                ) as days_1_to_2,
       datediff(day,
                 max(case when seqnum = 2 then date end),
                 max(case when seqnum = 3 then date end)
                ) as days_2_to_3
from (select t.*,
             row_number() over (partition by email order by date) as seqnum
      from Table t
     ) t
group by email;