1、第N高的薪水
https://leetcode-cn.com/problems/nth-highest-salary/
表结构:
Employee表,同前https://blog.csdn.net/qq_41023125/article/details/107958525。
要求:
编写一个 SQL 查询,获取 Employee 表中第 n 高的薪水(Salary),如果不存在第 n 高的薪水,那么查询应返回 null。
思路:
同第2题,
代码:
(1)LIMIT修改起点
CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
SET N:=N-1;
RETURN (
SELECT
salary
FROM
employee
GROUP BY
salary
ORDER BY
salary DESC
LIMIT N, 1
);
END
(2)查出前N,再取最小
CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
RETURN (
SELECT IF(count<N,NULL,min)
FROM
(SELECT MIN(Salary) AS min, COUNT(1) AS count
FROM
(SELECT DISTINCT Salary
FROM Employee ORDER BY Salary DESC LIMIT N) AS a
) as b
);
END
反思:
这题涉及到SQL定义函数,以前从来没有接触过,不知道怎么下手,看了评论区大佬的答案,原来SQL还能这样用!
2、分数排名
表结构:
Create table If Not Exists Scores (Id int, Score DECIMAL(3,2))
Truncate table Scores
insert into Scores (Id, Score) values ('1', '3.5')
insert into Scores (Id, Score) values ('2', '3.65')
insert into Scores (Id, Score) values ('3', '4.0')
insert into Scores (Id, Score) values ('4', '3.85')
insert into Scores (Id, Score) values ('5', '4.0')
insert into Scores (Id, Score) values ('6', '3.65')
要求:
编写一个 SQL 查询来实现分数排名。
如果两个分数相同,则两个分数排名(Rank)相同。请注意,平分后的下一个名次应该是下一个连续的整数值。换句话说,名次之间不应该有“间隔”。
思路:
排名要用到窗口函数,注意区分row_number(),dense_rank()和rank()。
代码:
SELECT Score,dense_rank() over(ORDER BY Score DESC) AS 'Rank'
FROM Scores;
注意:rank是关键字,要加引号才能用。