leetcode Database3(Nth Highest Salary<—>Consecutive Numbers<—>Department Highest Salary)
一、Nth Highest Salary
Write a SQL query to get the nth highest salary from the Employee table.
+----+--------+
| Id | Salary |
+----+--------+
| 1 | 100 |
| 2 | 200 |
| 3 | 300 |
+----+--------+
For example, given the above Employee table, the nth highest salary where n = 2 is 200. If there is no nth highest salary, then the query should return null.
分析:题意为编写SQL查询获取雇员表中的第n高薪水值。例如,给定上面的雇员表,当n为2时,第n高薪水为200.如果没有第n高薪水,查询返回null。
代码:
CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
set N=N-1;
RETURN (
# Write your MySQL query statement below.
SELECT DISTINCT Salary FROM Employee ORDER BY Salary DESC LIMIT N,1
);
END
注意:我刚开始使用的是LIMIT N-1,1 但是will cause error,经过了解才发现
Seems like MySQL can only take numeric constants in the LIMIT syntax. Directly from MySQL documentation:
The LIMIT clause can be used to constrain the number of rows returned by the SELECT statement. LIMIT takes one or two numeric arguments, which must both be nonnegative integer constants (except when using prepared statements).
二、Consecutive Numbers
Write a SQL query to find all numbers that appear at least three times consecutively.
+----+-----+
| Id | Num |
+----+-----+
| 1 | 1 |
| 2 | 1 |
| 3 | 1 |
| 4 | 2 |
| 5 | 1 |
| 6 | 2 |
| 7 | 2 |
+----+-----+
For example, given the above Logs table, 1 is the only number that appears consecutively for at least three times.
分析:题意为编写SQL去查询所有至少连续出现3次的数字。例如,给定上面的Logs表,1是唯一至少连续出现3次的数字。
代码:
使用join就好了
# Write your MySQL query statement below
SELECT DISTINCT a.Num As ConsecutiveNumbers
FROM Logs a
JOIN Logs b
ON a.Num = b.Num
JOIN Logs c
ON b.Num = c.Num
WHERE a.Id + 1 = b.Id
AND b.Id + 1 = c.Id
# Write your MySQL query statement below
SELECT DISTINCT Num FROM (
SELECT Num, COUNT(Rank) AS Cnt FROM (
SELECT Num,
@curRank := @curRank + IF(@prevNum = Num, 0, 1) AS rank, @prevNum := Num
FROM Logs s, (SELECT @curRank := 0) r, (SELECT @prevNum := NULL) p
ORDER BY ID ASC
) t GROUP BY Rank HAVING Cnt >= 3
) n;
此解法配合使用MySQL用户定义变量和聚组函数统计连续出现的数字个数:
以题目描述的Logs表为例,上面的SQL语句中,最内层的SELECT语句执行结果如下:
+-----+------+-----------------+
| Num | rank | @prevNum := Num |
+-----+------+-----------------+
| 1 | 1 | 1 |
| 1 | 1 | 1 |
| 1 | 1 | 1 |
| 2 | 2 | 2 |
| 1 | 3 | 1 |
| 2 | 4 | 2 |
| 2 | 4 | 2 |
+-----+------+-----------------+
执行结果中的rank列将Num转化为从1开始递增的序号,但序号只在Num出现变化时增加,(连续出现的相同数字序号也相同)
第二层SELECT语句对rank进行计数,并只保留计数不小于3的条目,执行结果为:
+-----+-----+
| Num | Cnt |
+-----+-----+
| 1 | 3 |
+-----+-----+
最外层SELECT语句对Num进行去重。
三、Department Highest Salary
The Employee table holds all employees. Every employee has an Id, a salary, and there is also a column for the department Id.
+----+-------+--------+--------------+
| Id | Name | Salary | DepartmentId |
+----+-------+--------+--------------+
| 1 | Joe | 70000 | 1 |
| 2 | Henry | 80000 | 2 |
| 3 | Sam | 60000 | 2 |
| 4 | Max | 90000 | 1 |
+----+-------+--------+--------------+
The Department table holds all departments of the company.
+----+----------+
| Id | Name |
+----+----------+
| 1 | IT |
| 2 | Sales |
+----+----------+
Write a SQL query to find employees who have the highest salary in each of the departments. For the above tables, Max has the highest salary in the IT department and Henry has the highest salary in the Sales department.
+------------+----------+--------+
| Department | Employee | Salary |
+------------+----------+--------+
| IT | Max | 90000 |
| Sales | Henry | 80000 |
+------------+----------+--------+
分析:题意为
雇员表Employee保存了雇员的Id,姓名,薪水以及部门Id。
部门表Department保存了部门的Id和名称。
编写一个SQL查询,找出每一个部门中薪水最高的员工信息。而且给出了样例结果。
代码:
可以先用临时表m查找出每个部门薪水最大值,然后使用薪水值和部门Id与表Employee进行内连接,再通过部门Id与表Dempartment做内连接即可。
# Write your MySQL query statement below
SELECT d.Name AS Department, e.Name AS Employee, m.Salary FROM
Employee e
INNER JOIN
(SELECT DepartmentId, MAX(Salary) AS Salary FROM Employee GROUP BY DepartmentId) m
USING(DepartmentId, Salary)
INNER JOIN
Department d
ON d.Id = m.DepartmentId
或者这么写:
select d.Name as Department, e.Name as Employee, e.Salary as Salary
from Employee e, Department d ,
(select DepartmentId ,MAX(Salary) as Salary from Employee group by DepartmentId ) m
where e.DepartmentId=m.DepartmentId and e.Salary=m.Salary and d.Id=e.DepartmentId;
其他解法:
SELECT D.Name AS Department, E.Name AS Employee, E.Salary AS Salary
FROM Employee AS E, Department AS D
WHERE E.DepartmentId = D.Id AND Salary >= ALL(
SELECT Salary
FROM Employee E_TMP
WHERE E_TMP.DepartmentId = E.DepartmentId);
leetcode Database3(Nth Highest Salary<—>Consecutive Numbers<—>Department Highest Salary)的更多相关文章
- leetcode - database - 177. Nth Highest Salary (Oracle)
题目链接:https://leetcode.com/problems/nth-highest-salary/description/ 题意:查询出表中工资第N高的值 思路: 1.先按照工资从高到低排序 ...
- [LeetCode] Consecutive Numbers 连续的数字 --数据库知识(mysql)
1. 题目名称 Consecutive Numbers 2 .题目地址 https://leetcode.com/problems/consecutive-numbers/ 3. 题目内容 写一个 ...
- [LeetCode] Department Highest Salary 系里最高薪水
The Employee table holds all employees. Every employee has an Id, a salary, and there is also a colu ...
- Leetcode之深度优先搜索(DFS)专题-129. 求根到叶子节点数字之和(Sum Root to Leaf Numbers)
Leetcode之深度优先搜索(DFS)专题-129. 求根到叶子节点数字之和(Sum Root to Leaf Numbers) 深度优先搜索的解题详细介绍,点击 给定一个二叉树,它的每个结点都存放 ...
- 【LeetCode】129. Sum Root to Leaf Numbers 解题报告(Python)
[LeetCode]129. Sum Root to Leaf Numbers 解题报告(Python) 标签(空格分隔): LeetCode 题目地址:https://leetcode.com/pr ...
- 【LeetCode】659. Split Array into Consecutive Subsequences 解题报告(Python)
[LeetCode]659. Split Array into Consecutive Subsequences 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id ...
- LeetCode Database: Consecutive Numbers
Consecutive Numbers Write a SQL query to find all numbers that appear at least three times consecuti ...
- [LeetCode] Department Highest Salary -- 数据库知识(mysql)
184. Department Highest Salary The Employee table holds all employees. Every employee has an Id, a s ...
- LeetCode DB: Department Highest Salary
The Employee table holds all employees. Every employee has an Id, a salary, and there is also a colu ...
随机推荐
- IAP Store Kit Guide(中文)
IAP Store Kit Guide(中文) 一.In App Purchase概览 Store Kit代表App和App Store之间进行通信.程序将从App Store接收那些你想要提供的产品 ...
- ffmpeg iOS 编译
编译模拟器版本1 到https://github.com/yuvi/gas-preprocessor下载gas-preprocessor.p并拷贝到/usr/sbin目录中2 下载ffmpeg源码.h ...
- Android 4.4 KitKat, the browser and the Chrome WebView
Having V8 as the JavaScript engine for the new web view, the JavaScript performance if much better, ...
- 索引服务混战ASP.NET――微软的又一个隔离墩
话说月初笔者在华山之巅搞定了ASP.NET一起莫名奇妙的异常,自此之后和公主过着…嘟--,不好意思,书都看杂了,串了台了.好,咱们闲言少叙,书归正传. 自从上次解决了由调试文件库引起的ASP.NET执 ...
- javascript实现数据结构:线性表--简单示例及线性表的顺序表示和实现
线性表(linear list)是最常用且最简单的一种数据结构.一个线性表是n个数据元素的有限序列.在稍复杂的线性表中,一个数据元素可以由若干个数据项(item)组成. 其中: 数据元素的个数n定义为 ...
- C内联汇编
用C写程序比直接用汇编写程序更简洁,可读性更好,但效率可能不如汇编程序,因为C程序毕竟要经由编译器生成汇编代码,尽管现代编译器的优化已经做得很好了,但还是不如手写的汇编代码.另外,有些平台相关的指令必 ...
- js的in运算符与instanceof运算符
in运算符:希望他的左操作数是一个字符串或可以转换为字符串,希望他的右操作数是一个对象.如果右操作数的对象拥有一个名为左操作数值的属性名,那么表达式返回true. var point= {x:1,y: ...
- linux下PostgreSQL数据库的源码安装
实验环境>>>>>>>>>>>>>>>>>>操作系统:CentOS release 6.3 ...
- lintcode:背包问题
背包问题 在n个物品中挑选若干物品装入背包,最多能装多满?假设背包的大小为m,每个物品的大小为A[i] 样例 如果有4个物品[2, 3, 5, 7] 如果背包的大小为,可以选择的空间. 如果背包的大小 ...
- java 哪些情况下会使对象锁释放
Java_多线程_锁释放 问:Java多线程运行环境中,在哪些情况下会使对象锁释放?答:由于等待一个锁的线程只有在获得这把锁之后,才能恢复运行,所以让持有锁的线程在不再需要锁的时候及时释放锁是很重要的 ...