今天我们继续MySQL面试题整理,今日的题目是用户充值金额相关

根据题目,我们来创建表
- create table user_log(
- login_date date comment '登陆日期',
- user_id int comment '用户id'
- );
-
- create table payment_log(
- order_id int primary key auto_increment comment '订单号',
- pay_date date comment '支付日期',
- user_id int comment '用户id',
- revenue int comment '充值金额'
- );
-
接下来为了更好的演示效果,我们来填充数据
- insert into user_log values
- ('2022-03-11', 10),
- ('2022-03-19', 10),
- ('2022-03-21', 10),
- ('2022-03-22', 10),
- ('2022-03-25', 10),
- ('2022-03-29', 10),
- ('2022-04-11', 10),
- ('2022-04-13', 10),
- ('2022-04-17', 10),
- ('2022-03-10', 20),
- ('2022-03-11', 20),
- ('2022-03-14', 20),
- ('2022-03-16', 20),
- ('2022-03-20', 20),
- ('2022-04-11', 20),
- ('2022-04-13', 20),
- ('2022-04-17', 20),
- ('2022-04-21', 20),
- ('2022-05-01', 20);
-
- insert into payment_log(pay_date, user_id, revenue) values
- ('2022-03-11', 10, 30),
- ('2022-03-11', 10, 30),
- ('2022-03-11', 10, 30),
- ('2022-03-11', 10, 30),
- ('2022-03-19', 10, 50),
- ('2022-03-19', 10, 50),
- ('2022-03-21', 10, 100),
- ('2022-03-21', 10, 100),
- ('2022-03-21', 10, 100),
- ('2022-03-22', 10, 20),
- ('2022-03-22', 10, 20),
- ('2022-03-25', 10, 10),
- ('2022-03-29', 10, 10),
- ('2022-04-11', 10, 70),
- ('2022-04-11', 10, 70),
- ('2022-04-13', 10, 80),
- ('2022-04-17', 10, 90),
- ('2022-03-10', 20, 90),
- ('2022-03-11', 20, 80),
- ('2022-03-14', 20, 60),
- ('2022-03-16', 20, 120),
- ('2022-03-20', 20, 99),
- ('2022-04-11', 20, 87),
- ('2022-04-13', 20, 53),
- ('2022-04-17', 20, 56),
- ('2022-04-21', 20, 77),
- ('2022-05-01', 20, 32),
- ('2022-03-10', 20, 29),
- ('2022-03-11', 20, 30),
- ('2022-03-14', 20, 18),
- ('2022-03-16', 20, 6),
- ('2022-03-20', 20, 19),
- ('2022-04-11', 20, 21),
- ('2022-04-13', 20, 20),
- ('2022-04-17', 20, 76),
- ('2022-04-21', 20, 82),
- ('2022-05-01', 20, 91);
-
万事具备,我们来完成需求吧
- /*
- 需求1:提取每个用户每日累计充值金额
- 需求2: 提取每个用户最后登陆7天的充值金额
- */
-
- -- 提取每个用户每日累计充值金额
- /*
- 思路:在payment_log中 针对于用户与日期分组 将金额累计求和
- */
- select user_id, pay_date, sum(revenue) as 充值金额
- from payment_log group by user_id, pay_date;
-
- -- 提取每个用户最后登陆7天的充值金额
- /*
- 要想获取相应的数据 我们需要连接查询
- 我们将上面每个用户每日的重置金额与用户表连接
- */
- select t.*, login_date,
- row_number() over(partition by user_id order by login_date desc) ranking
- from (select user_id, pay_date, sum(revenue) as 充值金额
- from payment_log group by user_id, pay_date) as t join user_log
- on t.user_id=user_log.user_id and pay_date=login_date;
-
- -- 以此数据为基础 找到前7个 然后统计每个用户的充值金额
- select user_id, sum(充值金额) from
- (select t.*, login_date,
- row_number() over(partition by user_id order by login_date desc) ranking
- from (select user_id, pay_date, sum(revenue) as 充值金额
- from payment_log group by user_id, pay_date) as t join user_log
- on t.user_id=user_log.user_id and pay_date=login_date) as t1
- where ranking < 8 group by user_id;
-END-
扫码添加请备注:python,进群与宋老师面对面交流:517745409