用户留存的计算

用户留存的计算,基本是老生常谈了。可是这么多年下来,关于留存的计算,真的是差异太大了。

最初版:

将每个用户的所有交易月份用group_concat()函数进行连接,把对应的结果导出到excel中,然后再用countifs来进行计算……

这个方法大概持续了半年左右,等到用户量大了之后,这个方法就不太好用了,特别是涉及到跨年的数据,好像也计算的不是特别准确。

第二版:

有天在对比这个月交易下个月流失的用户的时候,发现其实留存就是计算这批用户在后面月份中,有多少还有交易,所以出现了我这里也是巨复杂的第二版;

select trans_month,count(*) from v2.merchant_trans_statis_monthly where sign_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 12 month),'%Y%m')
GROUP BY trans_month order by trans_month asc;
select trans_month,count(*) from v2.merchant_trans_statis_monthly where sign_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 11 month),'%Y%m')
GROUP BY trans_month order by trans_month asc;
select trans_month,count(*) from v2.merchant_trans_statis_monthly where sign_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 10 month),'%Y%m')
GROUP BY trans_month order by trans_month asc;
select trans_month,count(*) from v2.merchant_trans_statis_monthly where sign_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 9 month),'%Y%m')
GROUP BY trans_month order by trans_month asc;
select trans_month,count(*) from v2.merchant_trans_statis_monthly where sign_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 8 month),'%Y%m')
GROUP BY trans_month order by trans_month asc;
select trans_month,count(*) from v2.merchant_trans_statis_monthly where sign_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 7 month),'%Y%m')
GROUP BY trans_month order by trans_month asc;
select trans_month,count(*) from v2.merchant_trans_statis_monthly where sign_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 6 month),'%Y%m')
GROUP BY trans_month order by trans_month asc;
select trans_month,count(*) from v2.merchant_trans_statis_monthly where sign_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 5 month),'%Y%m')
GROUP BY trans_month order by trans_month asc;
select trans_month,count(*) from v2.merchant_trans_statis_monthly where sign_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 4 month),'%Y%m')
GROUP BY trans_month order by trans_month asc;
select trans_month,count(*) from v2.merchant_trans_statis_monthly where sign_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 3 month),'%Y%m')
GROUP BY trans_month order by trans_month asc;
select trans_month,count(*) from v2.merchant_trans_statis_monthly where sign_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 2 month),'%Y%m')
GROUP BY trans_month order by trans_month asc;
select trans_month,count(*) from v2.merchant_trans_statis_monthly where sign_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 1 month),'%Y%m')
GROUP BY trans_month order by trans_month asc;
这个版本好复杂,每次也要跑很久并且要把结果贴到对应的地方去。

第三版:

select count(*) from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 11 month),'%Y%m')
and merchant_no in(select merchant_no from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 12 month),'%Y%m'))
union all
select count(*) from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 10 month),'%Y%m')
and merchant_no in(select merchant_no from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 12 month),'%Y%m'))
union all
select count(*) from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 9 month),'%Y%m')
and merchant_no in(select merchant_no from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 12 month),'%Y%m'))
union all
select count(*) from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 8 month),'%Y%m')
and merchant_no in(select merchant_no from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 12 month),'%Y%m'))
union all
select count(*) from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 7 month),'%Y%m')
and merchant_no in(select merchant_no from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 12 month),'%Y%m'))
union all
select count(*) from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 6 month),'%Y%m')
and merchant_no in(select merchant_no from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 12 month),'%Y%m'))
union all
select count(*) from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 5 month),'%Y%m')
and merchant_no in(select merchant_no from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 12 month),'%Y%m'))
union all
select count(*) from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 4 month),'%Y%m')
and merchant_no in(select merchant_no from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 12 month),'%Y%m'))
union all
select count(*) from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 3 month),'%Y%m')
and merchant_no in(select merchant_no from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 12 month),'%Y%m'))
union all
select count(*) from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 2 month),'%Y%m')
and merchant_no in(select merchant_no from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 12 month),'%Y%m'))
union all
select count(*) from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 1 month),'%Y%m')
and merchant_no in(select merchant_no from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 12 month),'%Y%m'))
union all
select count(*) from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 10 month),'%Y%m')
and merchant_no in(select merchant_no from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 11 month),'%Y%m'))
union all
select count(*) from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 9 month),'%Y%m')
and merchant_no in(select merchant_no from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 11 month),'%Y%m'))
union all
select count(*) from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 8 month),'%Y%m')
and merchant_no in(select merchant_no from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 11 month),'%Y%m'))
union all
select count(*) from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 7 month),'%Y%m')
and merchant_no in(select merchant_no from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 11 month),'%Y%m'))
union all
select count(*) from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 6 month),'%Y%m')
and merchant_no in(select merchant_no from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 11 month),'%Y%m'))
union all
select count(*) from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 5 month),'%Y%m')
and merchant_no in(select merchant_no from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 11 month),'%Y%m'))
union all
select count(*) from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 4 month),'%Y%m')
and merchant_no in(select merchant_no from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 11 month),'%Y%m'))
union all
select count(*) from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 3 month),'%Y%m')
and merchant_no in(select merchant_no from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 11 month),'%Y%m'))
union all
select count(*) from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 2 month),'%Y%m')
and merchant_no in(select merchant_no from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 11 month),'%Y%m'))
union all
select count(*) from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 1 month),'%Y%m')
and merchant_no in(select merchant_no from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 11 month),'%Y%m'))
union all
select count(*) from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 9 month),'%Y%m')
and merchant_no in(select merchant_no from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 10 month),'%Y%m'))
union all
select count(*) from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 8 month),'%Y%m')
and merchant_no in(select merchant_no from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 10 month),'%Y%m'))
union all
select count(*) from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 7 month),'%Y%m')
and merchant_no in(select merchant_no from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 10 month),'%Y%m'))
union all
select count(*) from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 6 month),'%Y%m')
and merchant_no in(select merchant_no from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 10 month),'%Y%m'))
union all
select count(*) from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 5 month),'%Y%m')
and merchant_no in(select merchant_no from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 10 month),'%Y%m'))
union all
select count(*) from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 4 month),'%Y%m')
and merchant_no in(select merchant_no from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 10 month),'%Y%m'))
union all
select count(*) from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 3 month),'%Y%m')
and merchant_no in(select merchant_no from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 10 month),'%Y%m'))
union all
select count(*) from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 2 month),'%Y%m')
and merchant_no in(select merchant_no from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 10 month),'%Y%m'))
union all
select count(*) from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 1 month),'%Y%m')
and merchant_no in(select merchant_no from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 10 month),'%Y%m'))
union all
select count(*) from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 8 month),'%Y%m')
and merchant_no in(select merchant_no from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 9 month),'%Y%m'))
union all
select count(*) from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 7 month),'%Y%m')
and merchant_no in(select merchant_no from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 9 month),'%Y%m'))
union all
select count(*) from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 6 month),'%Y%m')
and merchant_no in(select merchant_no from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 9 month),'%Y%m'))
union all
select count(*) from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 5 month),'%Y%m')
and merchant_no in(select merchant_no from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 9 month),'%Y%m'))
union all
select count(*) from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 4 month),'%Y%m')
and merchant_no in(select merchant_no from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 9 month),'%Y%m'))
union all
select count(*) from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 3 month),'%Y%m')
and merchant_no in(select merchant_no from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 9 month),'%Y%m'))
union all
select count(*) from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 2 month),'%Y%m')
and merchant_no in(select merchant_no from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 9 month),'%Y%m'))
union all
select count(*) from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 1 month),'%Y%m')
and merchant_no in(select merchant_no from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 9 month),'%Y%m'));
select count(*) from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 7 month),'%Y%m')
and merchant_no in(select merchant_no from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 8 month),'%Y%m'))
union all
select count(*) from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 6 month),'%Y%m')
and merchant_no in(select merchant_no from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 8 month),'%Y%m'))
union all
select count(*) from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 5 month),'%Y%m')
and merchant_no in(select merchant_no from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 8 month),'%Y%m'))
union all
select count(*) from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 4 month),'%Y%m')
and merchant_no in(select merchant_no from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 8 month),'%Y%m'))
union all
select count(*) from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 3 month),'%Y%m')
and merchant_no in(select merchant_no from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 8 month),'%Y%m'))
union all
select count(*) from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 2 month),'%Y%m')
and merchant_no in(select merchant_no from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 8 month),'%Y%m'))
union all
select count(*) from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 1 month),'%Y%m')
and merchant_no in(select merchant_no from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 8 month),'%Y%m'));
select count(*) from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 6 month),'%Y%m')
and merchant_no in(select merchant_no from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 7 month),'%Y%m'))
union all
select count(*) from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 5 month),'%Y%m')
and merchant_no in(select merchant_no from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 7 month),'%Y%m'))
union all
select count(*) from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 4 month),'%Y%m')
and merchant_no in(select merchant_no from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 7 month),'%Y%m'))
union all
select count(*) from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 3 month),'%Y%m')
and merchant_no in(select merchant_no from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 7 month),'%Y%m'))
union all
select count(*) from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 2 month),'%Y%m')
and merchant_no in(select merchant_no from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 7 month),'%Y%m'))
union all
select count(*) from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 1 month),'%Y%m')
and merchant_no in(select merchant_no from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 7 month),'%Y%m'));
select count(*) from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 5 month),'%Y%m')
and merchant_no in(select merchant_no from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 6 month),'%Y%m'))
union all
select count(*) from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 4 month),'%Y%m')
and merchant_no in(select merchant_no from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 6 month),'%Y%m'))
union all
select count(*) from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 3 month),'%Y%m')
and merchant_no in(select merchant_no from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 6 month),'%Y%m'))
union all
select count(*) from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 2 month),'%Y%m')
and merchant_no in(select merchant_no from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 6 month),'%Y%m'))
union all
select count(*) from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 1 month),'%Y%m')
and merchant_no in(select merchant_no from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 6 month),'%Y%m'));
select count(*) from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 4 month),'%Y%m')
and merchant_no in(select merchant_no from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 5 month),'%Y%m'))
union all
select count(*) from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 3 month),'%Y%m')
and merchant_no in(select merchant_no from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 5 month),'%Y%m'))
union all
select count(*) from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 2 month),'%Y%m')
and merchant_no in(select merchant_no from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 5 month),'%Y%m'))
union all
select count(*) from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 1 month),'%Y%m')
and merchant_no in(select merchant_no from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 5 month),'%Y%m'));
select count(*) from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 3 month),'%Y%m')
and merchant_no in(select merchant_no from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 4 month),'%Y%m'))
union all
select count(*) from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 2 month),'%Y%m')
and merchant_no in(select merchant_no from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 4 month),'%Y%m'))
union all
select count(*) from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 1 month),'%Y%m')
and merchant_no in(select merchant_no from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 4 month),'%Y%m'));
select count(*) from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 2 month),'%Y%m')
and merchant_no in(select merchant_no from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 3 month),'%Y%m'))
union all
select count(*) from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 1 month),'%Y%m')
and merchant_no in(select merchant_no from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 3 month),'%Y%m'));
select count(*) from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 1 month),'%Y%m')
and merchant_no in(select merchant_no from v2.merchant_trans_statis_monthly where trans_month=DATE_FORMAT(date_sub(CURDATE(),INTERVAL 2 month),'%Y%m'));

复杂到我自己都不太想看了,大概是把前面每个独立的结果自动粘到了一起;

第四版:

select aa.*,a.a,b.a,c.a,d.a,
e.a,
f.a,
g.a,
h.a,
i.a,
j.a,
k.a,
l.a,
m.a,
n.a,
o.a,
p.a,
q.a from (select trans_month,count(*)a from merchant_trans_statis_monthly GROUP BY trans_month) aa,
(select trans_month,count(*)a from merchant_trans_statis_monthly a,
(select merchant_no from merchant_trans_statis_monthly where trans_month=201701) b where a.merchant_no=b.merchant_no
GROUP BY trans_month)a,
(select trans_month,count(*)a from merchant_trans_statis_monthly a,
(select merchant_no from merchant_trans_statis_monthly where trans_month=201702) b where a.merchant_no=b.merchant_no
GROUP BY trans_month)b,
(select trans_month,count(*)a from merchant_trans_statis_monthly a,
(select merchant_no from merchant_trans_statis_monthly where trans_month=201703) b where a.merchant_no=b.merchant_no
GROUP BY trans_month)c,
(select trans_month,count(*)a from merchant_trans_statis_monthly a,
(select merchant_no from merchant_trans_statis_monthly where trans_month=201704) b where a.merchant_no=b.merchant_no
GROUP BY trans_month)d,
(select trans_month,count(*)a from merchant_trans_statis_monthly a,
(select merchant_no from merchant_trans_statis_monthly where trans_month=201705) b where a.merchant_no=b.merchant_no
GROUP BY trans_month)e,
(select trans_month,count(*)a from merchant_trans_statis_monthly a,
(select merchant_no from merchant_trans_statis_monthly where trans_month=201706) b where a.merchant_no=b.merchant_no
GROUP BY trans_month)f,
(select trans_month,count(*)a from merchant_trans_statis_monthly a,
(select merchant_no from merchant_trans_statis_monthly where trans_month=201707) b where a.merchant_no=b.merchant_no
GROUP BY trans_month)g,
(select trans_month,count(*)a from merchant_trans_statis_monthly a,
(select merchant_no from merchant_trans_statis_monthly where trans_month=201708) b where a.merchant_no=b.merchant_no
GROUP BY trans_month)h,
(select trans_month,count(*)a from merchant_trans_statis_monthly a,
(select merchant_no from merchant_trans_statis_monthly where trans_month=201709) b where a.merchant_no=b.merchant_no
GROUP BY trans_month)i,
(select trans_month,count(*)a from merchant_trans_statis_monthly a,
(select merchant_no from merchant_trans_statis_monthly where trans_month=201710) b where a.merchant_no=b.merchant_no
GROUP BY trans_month)j,
(select trans_month,count(*)a from merchant_trans_statis_monthly a,
(select merchant_no from merchant_trans_statis_monthly where trans_month=201711) b where a.merchant_no=b.merchant_no
GROUP BY trans_month)k,
(select trans_month,count(*)a from merchant_trans_statis_monthly a,
(select merchant_no from merchant_trans_statis_monthly where trans_month=201712) b where a.merchant_no=b.merchant_no
GROUP BY trans_month)l,
(select trans_month,count(*)a from merchant_trans_statis_monthly a,
(select merchant_no from merchant_trans_statis_monthly where trans_month=201801) b where a.merchant_no=b.merchant_no
GROUP BY trans_month)m,
(select trans_month,count(*)a from merchant_trans_statis_monthly a,
(select merchant_no from merchant_trans_statis_monthly where trans_month=201802) b where a.merchant_no=b.merchant_no
GROUP BY trans_month)n,
(select trans_month,count(*)a from merchant_trans_statis_monthly a,
(select merchant_no from merchant_trans_statis_monthly where trans_month=201803) b where a.merchant_no=b.merchant_no
GROUP BY trans_month)o,
(select trans_month,count(*)a from merchant_trans_statis_monthly a,
(select merchant_no from merchant_trans_statis_monthly where trans_month=201804) b where a.merchant_no=b.merchant_no
GROUP BY trans_month)p,
(select trans_month,count(*)a from merchant_trans_statis_monthly a,
(select merchant_no from merchant_trans_statis_monthly where trans_month=201805) b where a.merchant_no=b.merchant_no
GROUP BY trans_month)q
where aa.trans_month=a.trans_month and a.trans_month=b.trans_month and b.trans_month=c.trans_month and
c.trans_month=d.trans_month and 
d.trans_month=e.trans_month and 
e.trans_month=f.trans_month and 
f.trans_month=g.trans_month and 
g.trans_month=h.trans_month and 
h.trans_month=i.trans_month and 
i.trans_month=j.trans_month and 
j.trans_month=k.trans_month and 
k.trans_month=l.trans_month and 
l.trans_month=m.trans_month and 
m.trans_month=n.trans_month and 
n.trans_month=o.trans_month and 
o.trans_month=p.trans_month and 
p.trans_month=q.trans_month ;

进步不够明显,但是比之前的看着要好一些了。

第五版:

select a.trans_month,b.trans_month,count(a.merchant_no) from merchant_trans_statis_monthly a,
merchant_trans_statis_monthly b
where a.merchant_no=b.merchant_no
and a.trans_month<=b.trans_month
GROUP BY a.trans_month,b.trans_month;

这个时候,才发现留存问题的精髓是什么。

第六版:

select a.trans_month,b.trans_month,count(*) from merchant_trans_statis_monthly a,
merchant_trans_statis_monthly b
where a.merchant_no=b.merchant_no and b.trans_month>=a.trans_month
and a.trans_month>=201901
GROUP BY a.trans_month,b.trans_month;

选定某个时间点之后的留存计算,样本太多了,计算量大,本地数据库伤不起。

第七版:

select c.orgnize_id,a.trans_month,b.trans_month,count(DISTINCT a.merchant_no) from merchant_trans_statis_monthly a,
merchant_trans_statis_monthly b,
(select DISTINCT merchant_no,orgnize_id from merchant) c
where a.merchant_no=b.merchant_no
and a.merchant_no=c.merchant_no
and a.trans_month>=201901 and b.trans_month>=a.trans_month
and b.trans_month=201908
GROUP BY c.orgnize_id,a.trans_month,b.trans_month;

算各组织的留存情况。这个数据有个问题,每次都要把对应月份的数据用巨复杂的excel公司处理之后,汇总归纳求平均值。逼得我又想办法找到了后面的版本。

第八版:

create table trans_remain_source as
select b.orgnize_id,b.trans_month tm1,c.trans_month tm2,count(DISTINCT b.merchant_no),count(DISTINCT c.merchant_no),
left(b.trans_month,4)*12+right(b.trans_month,2)-left(c.trans_month,4)*12-right(c.trans_month,2) '第N月' from 
merchant_trans_statis_monthly b,
merchant_trans_statis_monthly c
where b.merchant_no=c.merchant_no
and b.trans_month>=c.trans_month
GROUP BY 1,2,3;

-- 新增交易留存月度数据源
insert into trans_remain_source 
select b.orgnize_id,b.trans_month tm1,c.trans_month tm2,count(DISTINCT b.merchant_no),count(DISTINCT c.merchant_no),left(b.trans_month,4)*12+right(b.trans_month,2)-left(c.trans_month,4)*12-right(c.trans_month,2) from 
(select * from merchant_trans_statis_monthly where trans_month=202005)b,
(select * from merchant_trans_statis_monthly where trans_month>=201812)c
where b.merchant_no=c.merchant_no
and b.trans_month>=c.trans_month
GROUP BY 1,2,3;

 

select orgnize_id,avg(N),avg(if(`N+1`>0,`N+1`,null)),
avg(if(`N+2`>0,`N+2`,null)),
avg(if(`N+3`>0,`N+3`,null)),
avg(if(`N+4`>0,`N+4`,null)),
avg(if(`N+5`>0,`N+5`,null)),
avg(if(`N+6`>0,`N+6`,null)),
avg(if(`N+7`>0,`N+7`,null)),
avg(if(`N+8`>0,`N+8`,null)),
avg(if(`N+9`>0,`N+9`,null)),
avg(if(`N+10`>0,`N+10`,null)),
avg(if(`N+11`>0,`N+11`,null)),
avg(if(`N+12`>0,`N+12`,null)),
avg(if(`N+13`>0,`N+13`,null)),
avg(if(`N+14`>0,`N+14`,null)),
avg(if(`N+15`>0,`N+15`,null)),
avg(if(`N+16`>0,`N+16`,null))
from (select orgnize_id,tm2,1 'N',
sum(if(第N月=1,用户数,0))/sum(if(第N月=0,用户数,0))'N+1',
sum(if(第N月=2,用户数,0))/sum(if(第N月=0,用户数,0))'N+2',
sum(if(第N月=3,用户数,0))/sum(if(第N月=0,用户数,0))'N+3',
sum(if(第N月=4,用户数,0))/sum(if(第N月=0,用户数,0))'N+4',
sum(if(第N月=5,用户数,0))/sum(if(第N月=0,用户数,0))'N+5',
sum(if(第N月=6,用户数,0))/sum(if(第N月=0,用户数,0))'N+6',
sum(if(第N月=7,用户数,0))/sum(if(第N月=0,用户数,0))'N+7',
sum(if(第N月=8,用户数,0))/sum(if(第N月=0,用户数,0))'N+8',
sum(if(第N月=9,用户数,0))/sum(if(第N月=0,用户数,0))'N+9',
sum(if(第N月=10,用户数,0))/sum(if(第N月=0,用户数,0))'N+10',
sum(if(第N月=11,用户数,0))/sum(if(第N月=0,用户数,0))'N+11',
sum(if(第N月=12,用户数,0))/sum(if(第N月=0,用户数,0))'N+12',
sum(if(第N月=13,用户数,0))/sum(if(第N月=0,用户数,0))'N+13',
sum(if(第N月=14,用户数,0))/sum(if(第N月=0,用户数,0))'N+14',
sum(if(第N月=15,用户数,0))/sum(if(第N月=0,用户数,0))'N+15',
sum(if(第N月=16,用户数,0))/sum(if(第N月=0,用户数,0))'N+16'
from (select orgnize_id,tm2,第N月,用户数 from trans_remain_source where orgnize_id in(200010,100070,100090,300020,100080,110010,110030))a
where tm2>=201812
GROUP BY tm2,orgnize_id)a
GROUP BY orgnize_id;

目前这个版本,看着感觉还行,有一个问题是每个月要把汇总表更新,另外是要加多第n月的数据,但是对比之前已经优化了很多了,对于这个问题,还需要继续优化。

每一个问题,都是未完待续。每一个问题的结束,又是另一个问题的开端……

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值