leetcode 数据库十题记录

题目从难到易记录。解题过程中,如果不太熟悉,可以将题目中的表自己手动录入到自己的数据库中,就方便学习,测试。185. Department Top Three Salaries要求就是查询出每个部门工资在前三的人。题意值得注意的一点就是,要求找出的是工资数前三的人,而不是工资最高的前三位。区别就是前者查询出来的人可能大于3,而后者最大只能为3.
最终答案:select b.Name Department,a.Name Employee,a.Salary from (select Name,if(@de=DepartmentId,if(@sa!=Salary,@in:=@in+1,@in),@in:=1) rank,@de:=DepartmentId DepartmentId,@sa:=Salary Salary from Employee,(select @in:=0,@de) tmp order by DepartmentId asc,Salary desc) a right join Department b on a.DepartmentId=b.Id where a.rank<=3思路:
1. 对每个部门的人按照工资的从高到低排序
2. 排序之后要对每个部门进行编号,使用mysql标量。此编号就类似成绩单,最高的第一,依次排序,如果工资一样,那么编号也一样。
3. 最后选择出编号小于或等于3的人
其中:if(@de=DepartmentId,if(@sa!=Salary,@in:=@in+1,@in),@in:=1) ## 这里的意思就是还需要根据部门来编号 ## 如果部门相同,则对比工资的大小,如果工资一样,则编号不变,否则+1 ## 如果部门不同,则编号直接赋值为1 262. Trips and Users题目要求是查询出2013-10-01至2013-10-03期间,未绑定用户的取消率。注意的是,此取消率的求法:未绑定用户取消数/未绑定用户的总请求数最终答案:select t.Request_at Day, round(ifnull(t1.c/t2.s,0),2) 'Cancellation Rate' from Trips t left join (select count(t.id) c, t.Request_at from Trips t left join Users u on t.Client_Id=u.Users_Id where Status!='completed' and u.Banned='No' group by Request_at) t1 on t.Request_at=t1.Request_at left join (select count(t.id) s, t.Request_at from Trips t left join Users u on t.Client_Id=u.Users_Id where u.Banned='No' and u.role='client' group by t.Request_at) t2 on t.Request_at=t2.Request_at where t.Request_at between '2013-10-01' and '2013-10-03' group by t.Request_at思路:
1.明确取消率的求法
2.构建两个临时表,一个可以得出未绑定用户的取消数,另一个可以得出未绑定用户的总请求数
3.加上日期等条件就可以得出结果

相关内容推荐