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;
我有一个简单的 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;