博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

SQL 实现月度留存率/复购率

Posted on 2020-11-19 14:19  隐灰子  阅读(1546)  评论(0编辑  收藏  举报

s q l实现用户的月度留存率/复购率

准备阶段:建立一个中间表 用户ID,用户复购或者访问时间即可。

注意点:注意去重

最好,跑出结果以后自己验证一下。

DROP TABLE IF EXISTS bigdata2c.temp_shoe_daidai_1118_04 ;
CREATE TABLE IF NOT EXISTS bigdata2c.temp_shoe_daidai_1118_04 AS
SELECT  distinct a.order_month
                    ,count(distinct a.user_id_month_0)  
                    ,count(distinct b.client_str)
                    ,count(distinct c.client_str) 
,count(distinct d.client_str)
,count(distinct f.client_str) ,count(distinct g.client_str) ,count(distinct h.client_str) ,count(distinct i.client_str) ,count(distinct j.client_str) ,count(distinct k.client_str) ,count(distinct l.client_str) ,count(distinct m.client_str) ,count(distinct n.client_str) FROM ( SELECT distinct SUBSTR(create_time,1,6) as order_month ,client_str AS user_id_month_0 FROM bigdata2c.temp_shoe_daidai_1118_01 where client_str is not NULL and create_time is not NULL and SUBSTR(create_time,1,6) >=201910 and SUBSTR(create_time,1,6) <=202010 ) a LEFT JOIN bigdata2c.temp_shoe_daidai_1118_02 b ON DATEDIFF( to_date(b.order_month,'yyyymm'),to_date(a.order_month,'yyyymm'),'mm') = 1 AND a.user_id_month_0 = b.client_str LEFT JOIN bigdata2c.temp_shoe_daidai_1118_02 c ON DATEDIFF( to_date(c.order_month,'yyyymm'),to_date(a.order_month,'yyyymm'),'mm') = 2 AND a.user_id_month_0 = c.client_str LEFT JOIN bigdata2c.temp_shoe_daidai_1118_02 d ON DATEDIFF( to_date(d.order_month,'yyyymm'),to_date(a.order_month,'yyyymm'),'mm') = 3 AND a.user_id_month_0 = d.client_str LEFT JOIN bigdata2c.temp_shoe_daidai_1118_02 f ON DATEDIFF( to_date(f.order_month,'yyyymm'),to_date(a.order_month,'yyyymm'),'mm') = 4 AND a.user_id_month_0 = f.client_str LEFT JOIN bigdata2c.temp_shoe_daidai_1118_02 g ON DATEDIFF( to_date(g.order_month,'yyyymm'),to_date(a.order_month,'yyyymm'),'mm') = 5 AND a.user_id_month_0 = g.client_str LEFT JOIN bigdata2c.temp_shoe_daidai_1118_02 h ON DATEDIFF( to_date(h.order_month,'yyyymm'),to_date(a.order_month,'yyyymm'),'mm') = 6 AND a.user_id_month_0 = h.client_str LEFT JOIN bigdata2c.temp_shoe_daidai_1118_02 i ON DATEDIFF( to_date(i.order_month,'yyyymm'),to_date(a.order_month,'yyyymm'),'mm') = 7 AND a.user_id_month_0 = i.client_str LEFT JOIN bigdata2c.temp_shoe_daidai_1118_02 j ON DATEDIFF( to_date(j.order_month,'yyyymm'),to_date(a.order_month,'yyyymm'),'mm') = 8 AND a.user_id_month_0 = j.client_str LEFT JOIN bigdata2c.temp_shoe_daidai_1118_02 k ON DATEDIFF( to_date(k.order_month,'yyyymm'),to_date(a.order_month,'yyyymm'),'mm') = 9 AND a.user_id_month_0 = k.client_str LEFT JOIN bigdata2c.temp_shoe_daidai_1118_02 l ON DATEDIFF( to_date(l.order_month,'yyyymm'),to_date(a.order_month,'yyyymm'),'mm') = 10 AND a.user_id_month_0 = l.client_str LEFT JOIN bigdata2c.temp_shoe_daidai_1118_02 m ON DATEDIFF( to_date(m.order_month,'yyyymm'),to_date(a.order_month,'yyyymm'),'mm') = 11 AND a.user_id_month_0 = m.client_str LEFT JOIN bigdata2c.temp_shoe_daidai_1118_02 n ON DATEDIFF( to_date(n.order_month,'yyyymm'),to_date(a.order_month,'yyyymm'),'mm') = 12 AND a.user_id_month_0 = n.client_str group by a.order_month ;