前言
我是Sam,一个正在转行成为数据分析师的骚年,目前刚刚从南洋理工大学毕业,正在为秋招做准备。转行原因一是因为真的很感兴趣,二是因为此方向前途明朗。注册这个账号可以帮助我记录一下我转行之路上的一些经历,包括一些学习总结、心理活动和困扰、对自己的激励等。同时也希望可以在这里遇到各种转型中和已经成为data大佬的各行各路朋友,一起学习探讨。
那么接下来,我想先对自己说一句话:既然选择了这条路,就要坚定地走下去。道路坎坷,坚持下来,等到成为数据分析师的那一天,你一定会感谢,现在的自己!加油!奥利给!
学习计划分为几部分,依次为:
1.工具使用:MySQL、python、PowerBI
2.数据分析方法总结
3.项目实践
那么这周的目标就是搞定MySQL,开始,冲冲冲!
MySQL学习
之前接触过SQL,但是仅会一些基础查询语句,因此这周开始系统学习MySQL,以下是一些自己认为比较难记忆的点,汇总一下。
难点查缺补漏
SQL table相关语句
SQL创建table的约束
int unsigned-无符号整型
auto_increment-自动增长
default-以默认值填充
not null-不为空
primary key-主键
创建数据表:
create table xxx (字段 类型 约束,
字段 类型 约束,
);
修改表列名
alter table students modify pet varchar(20) default 'cat';
插入数据
insert into 表名 values();
insert into students values(1,'list',18,178,'男',8);
insert into students values(1,'老李',17,168,'男',4),((1,'老刘',18,179,'男',3));
显示目前年份 date_format(now(),'%Y')
limit start,count; 从start后面一个数开始取,如limit 0 就是从第一个数开始取
select x from x where (a,b)=(1,2) a对应1,b对应2
时间函数
获取当前时间:
now 函数:获取当前时间信息,执行语句初就获取时间
sysdate 函数:执行到此函数再获取。
如:select now(), sleep(3),now();select sysdate(), sleep(3) , sysdate();有区别
获取年月日:current_date()
获取时分秒:current_time()
提取时间信息:month()、year()、day()等
时间计算
两个日期时间差:timestampdiff(unit, begin, end)
日期往前推:date_sub(被推移时间, interval '推移多久' 推移方式),如select date_add('2008-08-08 10:12:33', interval '01:10:30' hour_second);注意次函数必须要对 xxxx-xx-xx年月日完整的被推移时间使用,若不完整应用date_format进行标准化
日期往后推:date_add(被推移时间, interval '推移多久' 推移方式)
时间格式的转换:
字符串转换为时间:str_to_date(表示时间的字符串,字符串日期格式), 如 select str_to_date('08.09.2008 08:09:30', '%m.%d.%Y %h:%i:%s'); 结果:2008-08-09 08:09:30
日期格式转换为特殊字符串:date_format (日期,字符串格式),如:select date_format('2020-02-03 13:45:06.676','%Y-%M-%D %I:%i:%S-%T') ; --2020-February-3rd 01:45:06-13:45:06
如何计算复购率和回购率
涉及表:
orderinfo 订单详情表
| orderid 订单id
| userid 用户id
| isPaid 是否支付
| price 付款价格
| paidTime 付款时间
userinfo 用户信息表
| userid 用户id
| sex 用户性别
| birth 用户出生日期
统计用户三月份的回购率和复购率
复购率
a、筛选三月份下单的用户
select userid
from orderinfo
where month(paidtime)='03';
c、找到三月用户下载次数
select userid
from orderinfo
where month(paidtime)='03'
group by userid;
d、对于复购用户数和总购买用户数进行加和,并计算复购用户数/总购买人数
错误写法,
select count(1) as paid_cons, sum(if(cons>1,1,0)) as fugou_cons,
fugou_cons/paid_cons as fugou_rate (注意不能在select后用as来进行运算,要写原值)
from(select
userid,count(userid) as cons
from orderinfo
where month(paidtime)='03'
group by userid) as a;(子表后需要加名称)
正确:select count(1) as paid_cons, sum(if(cons>1,1,0)) as fugou_cons,
sum(if(cons>1,1,0))/count(1) as fugou_rate
from(select
userid,count(userid) as cons
from orderinfo
where month(paidtime)='03'
group by userid) as a;
回购率:3月购买的人中4月又购买的人数/3月购买的人的总数
a、找到每个月份的购买情况
select userid,
date_format(paidtime,'%Y-%m-01') as paid_m
from orderinfo
where ispaid='已支付'
group by userid, date_format(paidtime,'%Y-%m-01')
--注意 若date_format(paidtime,'%Y-%m-01')写成 date_format(paidtime,'%Y-%m'),在后面使用date_sub函数时将出错,使用date_sub函数必须要让年月日完整。
b、找到这个月购买了下个月也购买了的人,通过join相邻两列的paidtime
select *
from
(select userid,
date_format(paidtime,'%Y-%m-01') as paid_m
from orderinfo
where ispaid='已支付'
group by userid, date_format(paidtime,'%Y-%m-01')) a
left join
(select userid,
date_format(paidtime,'%Y-%m-01') as paid_m
from orderinfo
where ispaid='已支付'
group by userid, date_format(paidtime,'%Y-%m-01')) b
on a.userid=b.userid
and date_add(a.paid_m, interval 1 month)=b.paid_m
c、计算3月购买的人中4月又购买的人数count(b.paid_m)/3月购买的人的总数 count(a.paid_m)
select count(a.paid_m) as '本月购买人数', count(b.paid_m) as '本月与下月都购买人数', count(b.paid_m)/ count(a.paid_m) as '复购率'
from
(select userid,
date_format(paidtime,'%Y-%m-01') as paid_m
from orderinfo
where ispaid='已支付'
group by userid, date_format(paidtime,'%Y-%m-01')) a
left join
(select userid,
date_format(paidtime,'%Y-%m-01') as paid_m
from orderinfo
where ispaid='已支付'
group by userid, date_format(paidtime,'%Y-%m-01')) b
on a.userid=b.userid
and date_add(a.paid_m, interval 1 month)=b.paid_m
group by a.paid_m
总结
目前正在MySQL打怪的路上,已经从单个语句过渡到做完整题目,期间发现MySQL单个语句都不难,难就难在如何把不同的语句交叉使用完成1+1>2的效果,比如计算复购率的时候,用到了sum函数,使整个计算简便了很多。
很多题都琢磨了好久都没琢磨出来,最后还是看了答案才懂,中间踩了不少坑,但学习之路本该如此,现在多踩坑,未来路就平,少年仍需努力,未来可期~加油!