sql 占比计算_滴滴二面笔试题(sql)

8e3408636248096c1e3b5887e35c7189.png

题目同样来自开心鸭专栏,侵权删除

1.学生表:tb_student(name:学生姓名,id:学号,class:班级,in_time:入学时间,age:年龄,sex:性别,major:专业),学生成绩表:tb_score(id:学号,course:课程,score:分数)

我把它转换成列表形式方便理解:

0b1f3a466a47d2b9773c69be3853f3c3.png

1. 1筛选出2017年入学的“计算机”专业年龄最小的10位同学名单(姓名、学号、班级、年龄)

select name,id,class,age from tb_student
where in_time='2017 and major='计算机'
order by age   #(不写就是默认从小到大)
limit 10

第一题很简单,考察了条件筛选,排序,还有保留

1.2.统计每个班同学各科成绩平均分大于80分的人数和人数占比

select a.class,count(a.id) as 人数, 
count(a.id)/(select count(c.id) from tb_student c where a.class=c.class) as 占比
from tb_student a
where 80<(select avg(b.score) from tb_score as b
          where a.id=b.id)
group by a.class

考察表联结和关联子查询

3.用户教育经历表:tb_user_edu(uid:用户id,star_date:入学时间,end_date:毕业时间,degree:学历,school:学校,major:专业)

这题没有原题,自己出一题,每个专业毕业最早的用户是谁

考察窗口函数

select x.uid from 
(select uid,row_number() over (partition by major order by end_time) as ranking from tb_user_edu) as x
having x.row_number=1

4.table1(id:自增id,money:费用)问题:按id顺序累加money,取出累计值与1000相差最小差值的id

select id from 
(select id,sum(money) over (order by id asc) as 累计值 from table1) as c
order by abs(1000-累计值) asc
limit 1

窗口函数的考察

5.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 查询,找出每个部门工资第二高的员工。

先表联结再窗口函数排序

#但是有比较要注意的问题,两张表中都有重复的列名Name,因此查询的时候直接改成别名,否则会报错,另外注意partition by和order by 之间没有逗号,空格即可

select 部门,姓名 from (select b.name as 部门,a.Name as 姓名,
row_number() over (partition by b.Id order by a.salary desc) as ranking
from Employee as a inner join Department b on a.DepartmentId=b.Id) as c
where ranking=2

总结:二面重点考察了c窗口函数和表联结,不会的同学可以看我之前的文章

优梨:SQL高级功能:窗口函数​zhuanlan.zhihu.com
优梨:SQL:多表查询​zhuanlan.zhihu.com
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值