SQL面试题总结

链家——留存问题

找出表1中相机APP的当日用户活跃数以及次留,三留,七留。所得结果表如表2所示。

表1:

uidapp_namedurationtimesdayno
01相机122018-05-01
02微信232018-05-02
03美团422018-05-03
04微信632018-05-01
05相机312018-05-03
06相机232018-05-01
07相机222018-05-02
08微信112018-05-01
09美团322018-05-02
10相机432018-05-03
11相机542018-05-02
12美团652018-05-01
13微信712018-05-02
14相机222018-05-03
15相机132018-05-01
01美团122018-05-01
02微信132018-05-04
03相机322018-05-03
04微信432018-05-01
05相机422018-05-03
06相机222018-05-04
07美团232018-05-04
08微信122018-05-04
09相机332018-05-04
10相机432018-05-03
11相机542018-05-01
12美团652018-05-02
13微信542018-05-03
14相机222018-05-02
15相机122018-05-01
01美团122018-05-05
02微信132018-05-06
03相机322018-05-04
04微信432018-05-01
05相机422018-05-04
06相机222018-05-04
07美团232018-05-05
08微信122018-05-06
09相机332018-05-06
10相机432018-05-05
11相机542018-05-04
12美团652018-05-02
13微信542018-05-05
14相机222018-05-06
15相机122018-05-06
01美团122018-05-08
02微信132018-05-06
03相机322018-05-04
04微信432018-05-10
05相机422018-05-08
06相机222018-05-07
07美团232018-05-09
08微信122018-05-09
09相机332018-05-09
10相机432018-05-05
11相机542018-05-05
12美团652018-05-10
13微信542018-05-09
14相机222018-05-06
15相机122018-05-06
01美团122018-05-08
02微信132018-05-06
03相机322018-05-04
04微信432018-05-10
05相机422018-05-10
06相机222018-05-07
07美团232018-05-09
08微信122018-05-08
09相机332018-05-09
10相机432018-05-10
11相机542018-05-05
12美团652018-05-10
13微信542018-05-08
14相机222018-05-07
15相机122018-05-07
01美团122018-05-08
02微信132018-05-06
03相机322018-05-10
04微信432018-05-10
05相机422018-05-10
06相机222018-05-07
07美团232018-05-09
08微信122018-05-08
09相机332018-05-10
10相机432018-05-10
11相机542018-05-05
12美团652018-05-10
13微信542018-05-08
14相机222018-05-07
15相机122018-05-07

表2:

dayno用户活跃数次日留存数三日留存数七日留存数次日留存率三日留存率七日留存率
2018-05-01410225.00%0.00%50.00%
2018-05-02311033.33%33.33%0.00%
2018-05-03421050.00%25.00%0.00%
2018-05-04511320.00%20.00%60.00%
2018-05-0520000.00%0.00%0.00%
2018-05-06320066.67%0.00%0.00%
2018-05-0730000.00%0.00%0.00%
2018-05-0810100.00%100.00%0.00%
2018-05-091100100.00%0.00%0.00%
2018-05-1040000.00%0.00%0.00%
// 创建表格代码
create table userinfo(
uid varchar(10),
app_name varchar(20),
duration int(10),
times int(10),
dayno varchar(30)
);
 
 
insert into userinfo values
(01,'相机',1,2,'2018-05-01'),
(02,'微信',2,3,'2018-05-02'),
(03,'美团',4,2,'2018-05-03'),
(04,'微信',6,3,'2018-05-01'),
(05,'相机',3,1,'2018-05-03'),
(06,'相机',2,3,'2018-05-01'),
(07,'相机',2,2,'2018-05-02'),
(08,'微信',1,1,'2018-05-01'),
(09,'美团',3,2,'2018-05-02'),
(10,'相机',4,3,'2018-05-03'),
(11,'相机',5,4,'2018-05-02'),
(12,'美团',6,5,'2018-05-01'),
(13,'微信',7,1,'2018-05-02'),
(14,'相机',2,2,'2018-05-03'),
(15,'相机',1,3,'2018-05-01'),
(01,'美团',1,2,'2018-05-01'),
(02,'微信',1,3,'2018-05-04'),
(03,'相机',3,2,'2018-05-03'),
(04,'微信',4,3,'2018-05-01'),
(05,'相机',4,2,'2018-05-03'),
(06,'相机',2,2,'2018-05-04'),
(07,'美团',2,3,'2018-05-04'),
(08,'微信',1,2,'2018-05-04'),
(09,'相机',3,3,'2018-05-04'),
(10,'相机',4,3,'2018-05-03'),
(11,'相机',5,4,'2018-05-01'),
(12,'美团',6,5,'2018-05-02'),
(13,'微信',5,4,'2018-05-03'),
(14,'相机',2,2,'2018-05-02'),
(15,'相机',1,2,'2018-05-01'),
(01,'美团',1,2,'2018-05-05'),
(02,'微信',1,3,'2018-05-06'),
(03,'相机',3,2,'2018-05-04'),
(04,'微信',4,3,'2018-05-01'),
(05,'相机',4,2,'2018-05-04'),
(06,'相机',2,2,'2018-05-04'),
(07,'美团',2,3,'2018-05-05'),
(08,'微信',1,2,'2018-05-06'),
(09,'相机',3,3,'2018-05-06'),
(10,'相机',4,3,'2018-05-05'),
(11,'相机',5,4,'2018-05-04'),
(12,'美团',6,5,'2018-05-02'),
(13,'微信',5,4,'2018-05-05'),
(14,'相机',2,2,'2018-05-06'),
(15,'相机',1,2,'2018-05-06'),
(01,'美团',1,2,'2018-05-08'),
(02,'微信',1,3,'2018-05-06'),
(03,'相机',3,2,'2018-05-04'),
(04,'微信',4,3,'2018-05-10'),
(05,'相机',4,2,'2018-05-08'),
(06,'相机',2,2,'2018-05-07'),
(07,'美团',2,3,'2018-05-09'),
(08,'微信',1,2,'2018-05-09'),
(09,'相机',3,3,'2018-05-09'),
(10,'相机',4,3,'2018-05-05'),
(11,'相机',5,4,'2018-05-05'),
(12,'美团',6,5,'2018-05-10'),
(13,'微信',5,4,'2018-05-09'),
(14,'相机',2,2,'2018-05-06'),
(15,'相机',1,2,'2018-05-06'),
(01,'美团',1,2,'2018-05-08'),
(02,'微信',1,3,'2018-05-06'),
(03,'相机',3,2,'2018-05-04'),
(04,'微信',4,3,'2018-05-10'),
(05,'相机',4,2,'2018-05-10'),
(06,'相机',2,2,'2018-05-07'),
(07,'美团',2,3,'2018-05-09'),
(08,'微信',1,2,'2018-05-08'),
(09,'相机',3,3,'2018-05-09'),
(10,'相机',4,3,'2018-05-10'),
(11,'相机',5,4,'2018-05-05'),
(12,'美团',6,5,'2018-05-10'),
(13,'微信',5,4,'2018-05-08'),
(14,'相机',2,2,'2018-05-07'),
(15,'相机',1,2,'2018-05-07'),
(01,'美团',1,2,'2018-05-08'),
(02,'微信',1,3,'2018-05-06'),
(03,'相机',3,2,'2018-05-10'),
(04,'微信',4,3,'2018-05-10'),
(05,'相机',4,2,'2018-05-10'),
(06,'相机',2,2,'2018-05-07'),
(07,'美团',2,3,'2018-05-09'),
(08,'微信',1,2,'2018-05-08'),
(09,'相机',3,3,'2018-05-10'),
(10,'相机',4,3,'2018-05-10'),
(11,'相机',5,4,'2018-05-05'),
(12,'美团',6,5,'2018-05-10'),
(13,'微信',5,4,'2018-05-08'),
(14,'相机',2,2,'2018-05-07'),
(15,'相机',1,2,'2018-05-07');
--答案:
--次日留存:select * from 第一天 left join 第二天 on uid相同
--第一天活跃用户:
select * from userinfo where app_name = '相机' and dayno = '2018-05-01';
--次日留存left join+子查询:
select * from
(select * from userinfo where app_name = '相机' and dayno = '2018-05-01') a
left join
(select * from userinfo where app_name = '相机' and dayno = '2018-05-02') b
on a.uid = b.uid;
--计算活跃用户数:
select a.dayno,count(a.uid) as '用户活跃数',count(b.uid) as '次日留存数'
from
(select * from userinfo where app_name = '相机' and dayno = '2018-05-01') a
left join
(select * from userinfo where app_name = '相机' and dayno = '2018-05-02') b
on a.uid = b.uid;
-- 可用CASE...WHENDATEDIFF计算次留,三留,七留:
select a.dayno,count(distinct a.uid) as '用户活跃数',
count(distinct case when datediff(b.dayno,a.dayno) = 1 then b.uid else null end) as '次日留存数',
count(distinct case when datediff(b.dayno,a.dayno) = 2 then b.uid else null end) as '三日留存数',
count(distinct case when datediff(b.dayno,a.dayno) = 6 then b.uid else null end) as '七日留存数'
from
(select * from userinfo where app_name = '相机' and dayno = '2018-05-01') a
left join
(select * from userinfo where app_name = '相机') b
on a.uid = b.uid;

--最终答案:
select a.dayno,count(distinct a.uid) as '用户活跃数',
count(distinct case when datediff(b.dayno,a.dayno) = 1 then b.uid else null end) as '次日留存数',
count(distinct case when datediff(b.dayno,a.dayno) = 2 then b.uid else null end) as '三日留存数',
count(distinct case when datediff(b.dayno,a.dayno) = 6 then b.uid else null end) as '七日留存数',
concat(round(count(distinct case when datediff(b.dayno,a.dayno) = 1 then b.uid else null end)/count(distinct a.uid)*100,2),"%") as '次日留存率',
concat(round(count(distinct case when datediff(b.dayno,a.dayno) = 2 then b.uid else null end)/count(distinct a.uid)*100,2),"%") as '三日留存率',
concat(round(count(distinct case when datediff(b.dayno,a.dayno) = 6 then b.uid else null end)/count(distinct a.uid)*100,2),"%") as '七日留存率'
from
(select * from userinfo where app_name = '相机') a
left join
(select * from userinfo where app_name = '相机') b
on a.uid = b.uid
group by dayno;

总结: 遇到只有一个表,但是需要计数时间间隔的问题,就要想到用自联结来求时间间隔
类似题目:找出连续出现N次的内容
链家面试题:如何分析留存率?

行列互换

将表1转换为表2

表1:

nameenglishmathsmusic
Jim908899

表2:

namesubjectscore
Jimenglish90
Jimmaths88
Jimmusic99
--创建表格
create table a (
name varchar(20),
english int,
maths int,
music int);
insert into a values
("Jim",90,88,99);

--答案:
select name,'english' as subject,english as score
from a
union
select name,'maths' as subject,maths as score
from a
union
select name,'music' as subject,music as score
from a;

分组求和

将表1计算后得到表2,并描述计算过程

表1:

FDATEVALUE
2018/11/2310
2018/12/313
2019/2/953
2019/3/3123
2019/7/811
2019/7/3110

表2:

--创建表格
create table A2 (
FDATE datetime,
value int
);
insert into a2 values
("2018/11/23",10),
("2018/12/31",3),
("2019/2/9",53),
("2019/3/31",23),
("2019/7/8",11),
("2019/7/31",10);

--答案:
SELECT A.*,
SUM(VALUE) OVER (PARTITION BY FYEAR ORDER BY FMONTH) AS YSUM,
SUM(VALUE) OVER (ORDER BY FYEAR,FMONTH) AS SUM
FROM
(SELECT YEAR(FDATE) FYEAR, MONTH(FDATE) FMONTH,
SUM(VALUE) AS VALUE
FROM A2 GROUP BY YEAR(FDATE),MONTH(FDATE)) A

用户行为分析

表1:

表2:

name最近登陆时间登录次数
test12007-10-25-14:20:101
test22007-05-25-14:22:362
test42007-11-25-16:31:261

表3:

--创建表格
create table userlog 
(
    id int ,
    name varchar(10),
    EmailAddress varchar(50),
    lastlogon varchar(50)
);
insert into userlog values(100,'test4','test4@yahoo.cn','2007-11-25 16:31:26'),
(19,'test1','test4@yahoo.cn','2007-10-25 14:13:46'),
(42,'test1','test4@yahoo.cn','2007-10-25 14:20:10'),
(45,'test2','test4@yahoo.cn','2007-4-25 14:17:39'),
(49,'test2','test4@yahoo.cn','2007-5-25 14:22:36');

--1题答案:
SELECT name,
max(date_format(lastlogon,'%Y-%m-%d-%T')) AS 最近登陆时间,
count(distinct date_format(lastlogon,'%Y-%m-%d')) as 登录次数
from userlog
group by name
--2题答案:
SELECT name,
max(date_format(lastlogon,'%Y-%m-%d-%T')) AS 最近登陆时间,
count(distinct date_format(lastlogon,'%Y-%m-%d')) as 登录次数
from userlog
group by name

小红书面试题:如何分析用户行为?

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值