用户留存的计算,基本是老生常谈了。可是这么多年下来,关于留存的计算,真的是差异太大了。
最初版:
将每个用户的所有交易月份用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月的数据,但是对比之前已经优化了很多了,对于这个问题,还需要继续优化。
每一个问题,都是未完待续。每一个问题的结束,又是另一个问题的开端……