我需要您的快速帮助。 我想查找在首次购买后30天内进行第二次购买的客户的customer_id和firstpurchase_date的列表。
即curstomer_id的1,2,3在30天内进行了第二次购买。
我需要curstomer_id的1,2,3及其各自的第一个购买日期。
我有超过10万的customer_id。
如果我们可以用Python或SQL来实现,那就太好了。 非常感谢:)
答案 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子句中的日期所需的表达式。