MySQL面试题:用户金额充值面试题详解

151 篇文章 7 订阅
144 篇文章 18 订阅

今天我们继续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

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值