如何查找在30天内进行第二次购买的第一次购买日期?

时间:2020-02-29 13:11:57

标签: python sql pandas

我需要您的快速帮助。 我想查找在首次购买后30天内进行第二次购买的客户的customer_id和firstpurchase_date的列表。

即curstomer_id的1,2,3在30天内进行了第二次购买。

我需要curstomer_id的1,2,3及其各自的第一个购买日期。

我有超过10万的customer_id。

enter image description here

如果我们可以用Python或SQL来实现,那就太好了。 非常感谢:)

2 个答案:

答案 0 :(得分:2)

您可以使用窗口功能获取首次购买,然后计算前30天的购买次数:

select distinct customer_id, first_purchase_date
from (select t.*,
             min(purchase_date) over (partition by customer_id) as first_purchase_date
      from t
     ) t
where purchase_date <= first_purchase_date + interval '30 day' and
      purchase_date > first_purchase_date;

这使用标准的SQL语法。日期函数因数据库而异,因此数据库中的语法可能略有不同。

我也希望看到购买数量,所以我将其写为:

select customer_id, first_purchase_date, count(*)
from (select t.*,
             min(purchase_date) over (partition by customer_id) as first_purchase_date
      from t
     ) t
where purchase_date <= first_purchase_date + interval '30 day' 
group by customer_id, first_purchase_date
having count(*) > 1;

注意:这与上一个查询略有不同。第一个只算在不同的内进行第二次购买。这也算第二次购买,也可能是在第一个购买日期。我将两者都包括在内,因为不清楚您真正想要的是什么。

答案 1 :(得分:1)

如果要在没有窗口功能的情况下实现此目的,则可以将表与一个老式的聚合子查询结合起来,该查询返回每个客户的第一次购买。它也可以是执行相同工作的视图或CTE。

SELECT DISTINCT customer_id, first_purchase_date
FROM Purchases AS P1 INNER JOIN
( 
   SELECT customer_id, min(purchase_date) AS first_purchase_date
   FROM Purchases 
   GROUP BY customer_id
) AS P2 ON P1.customer_id = P2.customer_id
WHERE purchase_date <= first_purchase_date + 30 days;

像以前的贡献者一样,我恐怕对您正在使用的dbms没有任何经验,所以我无法帮助您比较WHERE子句中的日期所需的表达式。