我有一个简单的表,其中包含客户电子邮件,他们的订单数(因此,如果这是他们的第一笔订单,第三笔订单,第五笔订单等),订单的创建日期,该订单的价值以及总订单为那个客户计数。
这是我的桌子的样子
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;
这给了我每个客户购买天数之间的平均值。然后,我将该表作为原始表的子查询加入,并通过客户电子邮件将其加入。
现在我想要的是每个客户,从第一笔订单到第二笔订单花费的天数(如果没有第二笔订单,则为0或空值),以及从第二笔订单到第三笔订单花费的天数。 (如果没有三阶,则同样如此)
因此,它与我的上层查询非常相似,但不是对min和max进行datediff,而是对min和min plus 1或min plus 1和min plus 2进行datediff。
这可能吗?
或者我可以通过在Order#= 2的情况下做一些case语句来做到这一点。
此外,如果太难了,我不需要递归地使用它,仅前三个命令就足够了。
答案 0 :(得分:1)
您可以使用条件聚合来做到这一点:
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;