我有一个事件表,其中记录的行动,客户采取在我们的网站。我想知道一个顾客在最后购买一件商品之前拜访了多少次。
上表将聚合为
在第一周,顾客1进行了3次访问(包括他购买的那次访问)。他又在同一周的另一次拜访中买了一件东西。所以你可以在第一种情况下看到3,在第二种情况下看到1。也就是说,每次用户进行购买时,计数都应该重置。
我想出的解决方案非常混乱,速度慢(涉及多个连接和3个windows函数),在某些情况下不起作用。我漏掉了一些数据。
如果有人能在正确的方向上帮助我处理这个场景,那就太好了。
提前谢谢。
发布于 2022-04-13 18:11:11
试试这个:
WITH
-- your input, don't use in final query
visits(wk,visit_id,cust_id,has_purchased) AS (
SELECT 1,1,1,FALSE
UNION ALL SELECT 1,2,1,FALSE
UNION ALL SELECT 1,3,1,TRUE
UNION ALL SELECT 1,2,1,TRUE
)
-- real query starts here, replace following comma with "WITH"
,
with_counter AS (
SELECT
*
, LAG(CASE WHEN has_purchased THEN 1 ELSE 0 END,1,0)
OVER(PARTITION BY wk,cust_id ORDER BY visit_id) AS grp_end
FROM visits
)
SELECT
wk
, cust_id
, grp_end
, COUNT(*) AS visits_before_purchase
FROM with_counter
GROUP BY
wk
, cust_id
, grp_end
;
-- out wk | cust_id | grp_end | visits_before_purchase
-- out ----+---------+---------+------------------------
-- out 1 | 1 | 0 | 3
-- out 1 | 1 | 1 | 1
发布于 2022-04-13 18:47:48
我假设每一次客户访问,他们的访问id将增加1次。因此,我只是取不同的访问身份给每个客户,以了解他们在购买东西之前进行了多少次访问。
SELECT weeks, visit_id, customer_id, purchase_flag,
CASE WHEN diff IS null then visit_id else diff
end
FROM (
SELECT *, visit_id - LAG(visit_id) over (partition by customer_id order by
customer_id, visit_id)as diff
FROM customer
WHERE purchase_flag = 1
) as t ORDER BY customer_id, visit_id
https://stackoverflow.com/questions/71865259
复制相似问题