第1题 —— 数据库操作

表ord(用户订单表)

user_id ord_id ord_amt create_time(预定时间)
1 001 888 2019-05-01
1 002 367 2019-05-03
1 003 500 2019-05-04
1 004 987 2019-05-11
1 005 769 2019-05-12
205 009 209 2019-05-07
205 010 780 2019-05-08
205 020 998 2019-05-12

表act_usr(活动参与用户表)

act_id user_id create_time(报名时间)
Act_1 1 2019-05-03
Act_2 80 2019-05-06
Act_3 205 2019-05-07

(1)创建表act_output,保存以下信息:
区分不同活动,统计每个活动对应所有用户在报名参与活动之后产生的总订单金额、总订单数(一个用户只能参加一个活动)。

  1. create table act_output as
  2. select act_id,count(ord_id) as '总订单数',sum(ord_amt)as'总金额'
  3. from act_usr a
  4. left join ord o
  5. on a.user_id=o.user_id and a.create_time<=o.create_time
  6. group by act_id

(2)加入活动开始后每天都会产生订单,计算每个活动截止当前(测评当天)平均每天产生的订单数,活动开始时间假设为用户最早报名时间。

  1. select act_id,
  2. count(ord_id) as '总订单数',
  3. datediff('2021-01-01',min(a.create_time))+1 as '时间间隔',
  4. count(ord_id)/(datediff('2021-01-01',min(a.create_time))+1)as '平均每日产生的订单数'
  5. from act_usr a
  6. left join ord o
  7. on a.user_id=o.user_id and a.create_time<=o.create_time
  8. group by act_id

第2题 —— 数据库操作

某网络用户访问操作流水表 tracking_log,

user_id opr_type(操作类型) log_time(操作时间)
1 A 2019-05-01
1 B 2019-05-01
1 C 2019-05-01
1 B 2019-05-07
1 E 2019-05-08
2 A 2019-05-06
2 B 2019-05-06

(1)计算网站每天的访客数以及他们的平均操作次数;

  1. select date(log_time),#date()将datetime转化为date
  2. count(distinct user_id)as '访客数',
  3. count(*)/count(distinct user_id) as '平均操作次数'
  4. from tracking_log
  5. group by date(log_time)

(2)统计每天符合A操作后B操作的操作模式的用户数,即要求AB相邻。

  1. select date(log_time),count(distinct user_id)
  2. from (
  3. select user_id,
  4. opr_type,
  5. log_time,
  6. lead(opr_type)over(partition by user_id,log_time order by log_time) as next_opr_type
  7. from tracking_log
  8. ) as t1
  9. where opr_type='A' and next_opr_type='B'
  10. group by date(log_time)

3)统计用户行为序列为A-B-D的用户数
其中:A-B之间可以有任何其他浏览记录(如C,E等),B-D之间除了C记录可以有任何其他浏览记录(如A,E等)
group_concat()是研究行为路径“顺序”的万能方案
注意⚠️:问清楚是abd连续的操作,还是只要求三者顺序,中间可以还有其他操作**

  1. select count(*)
  2. from (
  3. select user_id, group_concat(opr_type order by log_time separator '-') as user_behavior
  4. from tracking_log
  5. group by user_id
  6. having user_behavior like '%A%B%D%' and user_behavior not like '%A%B%C%D%'
  7. ) as t1

第3题 —— 数据库操作

根据第2题的用户访问操作流水表 tracking_log,
(1)计算网络每日新增访客表(在这次访问之前没有访问过该网站);

  1. select reg, count(distinct user_id) as '新增访客数'
  2. from (
  3. select user_id,min(log_time) as reg
  4. from tracking_log
  5. group by user_id
  6. ) as t1
  7. group by reg

(2)新增访客的第2日、第30日回访比例。

  1. create table register_log as
  2. select user_id,min(log_time) as reg
  3. from tracking_log
  4. group by user_id
  5. select reg, '时间间隔', '留存数'/'新增访客数' as '回访比例'
  6. from (
  7. select reg,count(distinct user_id) as '新增访客数'
  8. from register_log
  9. group by reg
  10. ) as t1
  11. join (
  12. select reg,datediff(t.log_time,reg)as '时间间隔',count(distinct user_id) as '留存数'
  13. from register_log r join tracking_log t on r.user_id=t.user_id
  14. where datediff(t2.log_time,reg)=1 or datediff(t2.log_time,reg)=29
  15. group by reg,t.log_time
  16. ) as t2
  17. on t1.reg=t2.reg
  18. order by reg,'时间间隔';