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.加上日期等条件就可以得出结果
177. Nth Highest Salary
题目给出Employee表,要求找出表中第n高的工资,如果不存在则返回null,并且用function 来完成
最终答案:
CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
declare m int;
set m=N-1;
RETURN (
select ifnull((select distinct(Salary) from Employee order by Salary desc limit m,1),null)
);
END
思路:
1.第N高,那么应该使用limit来筛选结果
2.配合ifnull函数,若不存在则返回null
184. Department Highest Salary
题目给出Empployee和Department表,要求查询出每个部门的拿最高工资的人。
最终答案:
select c.Name Department,d.Name Employee,c.Salary from
(select max(a.Salary) Salary,b.Name,a.DepartmentId from Employee a
inner join Department b
on a.DepartmentId=b.Id group by a.DepartmentId) c,
Employee d
where d.Salary=c.Salary and d.DepartmentId=c.DepartmentId
思路:
1. 使用group by搭配上max()函数就可以找出每个部门的最高工资的那个人
2. 表连接时使用inner join是因为left join在某个测试用例中,一些字段为null值
180. Consecutive Numbers
题目给出Logs表,要求查找出Num字段中,连续出现至少3次的数字
最终答案:
select distinct(a.Num) ConsecutiveNums from
Logs a,Logs b,Logs c
where a.Num=b.Num and a.Num=c.Num and a.Id+1=b.Id and b.Id+1=c.Id
思路:
1.连续出现,那么就判断一下对于连续的Id值,他的Num值是不是一样的
178. Rank Scores
题目给出Score表,要求对表进行排名,score值相同的排名也相同,除此之外排名的名次要求全部都是连续的。
最终答案:
select c.score Score,d.rank Rank from
(select a.score,@i:=@i+1 rank from
(select distinct score from Scores order by score desc) a,(select @i:=0) b) d,
Scores c where c.score=d.score order by score desc
思路:
1.需要注意题意的是,分数相同的排名相同,除此之外,排名要求全部是连续的
2.先对score去重之后,借助变量来对score进行排名,将结果放入临时表中
3.最后就可以根据分数来查询出名次
196. Delete Duplicate Emails
题目给出Persion表,其中有Email字段,要求删除重复的Email
最终答案:
delete a from Person a,Person b where a.Id>b.Id and a.Email=b.Email
思路:
1.就是找出Email值相同而Id值不同的那条数据,并删除
176. Second Highest Salary
题目给出Employee表,要求找出第二高的工资
最终答案:
select ifnull((select distinct(Salary) from Employee order by Salary desc limit 1,1),null) SecondHighestSalary
思路:
1.排序后使用limit
2.注意结果需要处理null的情况
197. Rising Temperature
题目给出Weather表,要求找出升温那天的Id值,升温是指当天的温度与其前一天的温度比较,升高了的。
最终答案:
select a.Id from Weather a,Weather b where datediff(a.Date,b.Date)=1 and a.Temperature>b.Temperature
思路:
1.如果知道datediff这个函数,那么会很好求
2.我开始也不知道有这个函数,但是知道要用日期函数,于是去找相关函数时发现的这个函数。
183. Customers Who Never Order
题目给出两张表:Customers,Order。要求找出没有订购过任何东西的customer
最终答案:
select Name as Customers from Customers where Id not in(select distinct(CustomerId) from Orders)
思路:
1.使用表连接一样可以解决
175. Combine Two Tables
题目给出Persion表和Address表,要求找出Persion表中的人的FirstName,LastName,City,State,不用管这个人是否有Address
最终答案:
select a.FirstName,a.LastName,b.City,b.State from Person a left join Address b on a.PersonId=b.PersonId
181. Employees Earning More Than Their Managers
题目给出Employee表,要求找出工资比他的领导还高的员工
最终答案:
select a.Name as Employee from Employee a left join Employee b on a.ManagerId=b.Id where a.Salary>b.Salary
182. Duplicate Emails
给出Persion表,要求找出所有重复的email
最终答案:
select Email from Person group by Email having count(Email)>1
思路:
1. group by having是用来对查询之后的结果进行筛选的
leetcode 数据库十题记录的更多相关文章
- leetcode第十题--Regular Expression Matching
Problem:Implement regular expression matching with support for '.' and '*'. '.' Matches any single c ...
- LeetCode第二十题-有效的括号
Valid Parentheses 问题简介: 给定一个只包含字符 ‘(’ , ‘)’ , ‘{’ , ‘}’ , ‘[’ , ‘]’ 的字符串,确定输入字符串是否有效 有效的条件: 必须使用相同类型 ...
- LeetCode第十题-正则表达式匹配
Regular Expression Matching 问题简介:给定字符串,给定匹配模式,判断字符串是否满足匹配模式 问题详解:一共有两种特殊模式: ‘.’ 匹配任何单个字符 ‘*’ 匹配前面元素的 ...
- LeetCode 刷题记录(二)
写在前面:因为要准备面试,开始了在[LeetCode]上刷题的历程.LeetCode上一共有大约150道题目,本文记录我在<http://oj.leetcode.com>上AC的所有题目, ...
- LeetCode 刷题记录
写在前面:因为要准备面试,开始了在[LeetCode]上刷题的历程.LeetCode上一共有大约150道题目,本文记录我在<http://oj.leetcode.com>上AC的所有题目, ...
- leetcode刷题记录--js
leetcode刷题记录 两数之和 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但 ...
- Leetcode刷题记录(python3)
Leetcode刷题记录(python3) 顺序刷题 1~5 ---1.两数之和 ---2.两数相加 ---3. 无重复字符的最长子串 ---4.寻找两个有序数组的中位数 ---5.最长回文子串 6- ...
- leetcode top-100-liked-questions刷题总结
一.起因 宅在家中,不知该做点什么.没有很好的想法,自己一直想提升技能,语言基础自不必言,数据结构还算熟悉,算法能力一般.于是乎,就去刷一通题. 刷题平台有很多,我选择了在leetcode进行刷题.回 ...
- C语言考试解答十题
学院比较奇葩,大一下期让学的VB,这学期就要学C++了,然后在开学的前三个周没有课,就由老师讲三个周的C语言,每天9:30~11:30听课,除去放假和双休日,实际听课时间一共是12天*2小时,下午是1 ...
随机推荐
- 关于Android真机调測Profiler
u3d中的Profile也是能够直接在链接安卓设备执行游戏下查看的,导出真机链接U3D的Profile看数据,这样能更好的測试详细原因. 大概看了下官方的做法.看了几张帖子顺带把做法记录下来. 參考: ...
- HTML样式以及使用
HTML的样式包含: 1,标签{style ,link} 2.属性{rel="styleSheet"外部样式表,type="text/css",margin-l ...
- 安卓开发--sharedpreferences存储数据
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); s ...
- Hadoop-CDH源码编译
* Hadoop-CDH源码编译 这一节我们主要讲解一下根据CDH源码包手动编译的过程,至于为什么要使用CDH,前几节已经说明,那为什么又要自己手动编译,因为CDH的5.3.6对应的Hadoop2.5 ...
- ASP.NET 部分视图
ASP.NET MVC 里的部分视图,相当于 Web Form 里的 User Control.我们的页面往往会有许多重用的地方,可以进行封装重用. 使用部分视图有以下优点: 1. 可以简写代码. ...
- elementui的时间选择器开始时间和结束时间的限制
开始时间不能大于结束时间 html代码部分 方法部分 开始时间和结束时间可以选同一天 <template> <div class="range-wrapper"& ...
- 企业级Nginx+Keepalived集群实战(双主架构)
随着Nginx在国内的发展潮流,越来越多的互联网公司都在使用Nginx,Nginx高性能.稳定性成为IT人士青睐的HTTP和反向代理服务器.Nginx负载均衡一般位于整个网站架构的最前端或者中间层,如 ...
- 在ubuntu上使用华为的3G无线上网卡 - usb_modeswitch
众所周知,华为或者中兴的无线上网卡是比较好用的,U盘一样的东西,插进电脑的Usb口就能用,但是,这只是针对windows操作系统而言. 对于linux系统,该设备是无法自动加载驱动的. 因此,需要用到 ...
- Centos7不修改默认交换分区下添加交换分区
交换分区介绍 Linux系统中的交换分区是当物理内存(RAM)被充满时,作为物理内存的缓存来使用. 当系统需要更多的内存资源而物理内存已经充满,内存中不活跃的页就会被移动到交换分区上. 交换分区位于硬 ...
- Node实现简单的注册时后端的MVC模型架构
实现一个简单的注册界面后端MVC模型架构 第一步:在生成的express框架的app.js中添加一个路由,代码如下:var api = require('./routes/api'); app.use ...