转载的,加一些自己的思考。
滴滴出行二面笔试题
一个玩数据分析的鸭鸭
已关注
8 人赞同了该文章
在喝奶茶的时候突然收到一封邮件,猝不及防的开始了滴滴出行国际部二面笔试。感觉题目还是比较基础的,我以为会有什么留存率一些比较困难的业务题,慌的我喝了几杯水,没想到十分钟就做完了,中途还接了个推销电话..
学生表:tb_student(name:学生姓名,id:学号,class:班级,in_time:入学时间,age:年龄,sex:性别,major:专业)
1)学生成绩表:tb_score(id:学号,course:课程,score:分数)
1. 筛选出2017年入学的“计算机”专业年龄最小的10位同学名单(姓名、学号、班级、年龄)
select name,id,class,age
from tb_student
where in_time='2017' and major='计算机'
order by age asc
limit 10
2.统计每个班同学各科成绩平均分大于80分的人数和人数占比
select c.class,
sum (case when c.avg_score >80 then 1 else 0 end) as ' 每个班同学各科成绩平均分大于80分的人数',
sum (case when c.avg_score >80 then 1 else 0 end)/count(c.id) as ' 每个班同学各科成绩平均分大于80分的人数占比',
from
(select a.id,a.class,avg(b.score) as avg_score
from tb_student a inner join tb_score b on a.id=b.id
group by 1)c
group by 1
参考:SELECT a.class,
sum(case when aaa.x > 80 then 1 else 0 end)as num_80 ,
(sum(case when aaa.x > 80 then 1 else 0 end)/count(*))as proportion
from tb_student a
INNER JOIN (SELECT id,avg(score)as x from tb_score GROUP BY id)as aaa
on a.id = aaa.id
GROUP BY class;
解析:写一个子查询,从score表中得到以学号分组的学生各科平均分。命名为aaa,将其与学生表内联结。再以class分组,得到以class分组的各班学生的平均分,最后通过case语句,sum聚合函数得到平均分>80分的计数,和所占各班总人数比例。
2)用户教育经历表:tb_user_edu(uid:用户id,star_date:入学时间,end_date:毕业时间,degree:学历,school:学校,major:专业)
3)table1(id:自增id,money:费用)问题:按id顺序累加money,取出累计值与1000相差最小差值的id。
select id
from(
select id,abs(1000-sum(money) over(order by id))as sub
from money
order by sub )a
limit 1
这个重要!
4) Employee 表包含所有员工信息,每个员工有其对应的 Id, salary 和 DepartmentId。
+----+-------+--------+--------------+
| Id | Name | Salary | DepartmentId |
+----+-------+--------+--------------+
| 1 | Joe | 70000 | 1 |
| 2 | Henry | 80000 | 2 |
| 3 | Sam | 60000 | 2 |
| 4 | Max | 90000 | 1 |
Department 表包含公司所有部门的信息。
+----+----------+
| Id | Name |
+----+----------+
| 1 | IT |
| 2 | Sales |
+----+----------+
编写一个 SQL 查询,找出每个部门工资第二高的员工。
seelct c.id
(select a.deparmentid,rank( ) over (partition by a.departmentid order by a.salary desc ) as rank_
employee a inner join department b on a.id=b.id)c
where c.rank_=2
写错了,emm 最开始好像并不需要join








网友评论