Skip to content

Commit 435f106

Browse files
authored
feat: update solutions to lc problems: No.0176~0178 (doocs#1711)
* No.0176.Second Highest Salary * No.0177.Nth Highest Salary * No.0178.Rank Scores
1 parent 41d49dc commit 435f106

File tree

9 files changed

+51
-78
lines changed

9 files changed

+51
-78
lines changed

solution/0100-0199/0176.Second Highest Salary/README.md

+10-24
Original file line numberDiff line numberDiff line change
@@ -79,11 +79,11 @@ Employee 表:
7979

8080
**方法二:使用 MAX() 函数和子查询**
8181

82-
使用 `MAX()` 函数,从小于 `MAX()` 的 Salary 中挑选最大值 `MAX()` 即可
82+
我们也可以使用 `MAX()` 函数,从小于 `MAX()` 的薪水中挑选一个最大的薪水即可
8383

84-
**方法三:使用 IFNULL() 和窗口函数**
84+
**方法三:使用 DISTINCT 和窗口函数**
8585

86-
我们也可以先通过 `dense_rank()` 函数计算出每个员工的薪水排名,然后再筛选出排名为 $2$ 的员工即可,如果不存在第二高的薪水,那么就返回 `null`
86+
我们还可以先通过 `DENSE_RANK()` 函数计算出每个员工的薪水排名,然后再筛选出排名为 $2$ 的员工薪水即可
8787

8888
<!-- tabs:start -->
8989

@@ -93,38 +93,24 @@ Employee 表:
9393
# Write your MySQL query statement below
9494
SELECT
9595
(
96-
SELECT DISTINCT Salary
96+
SELECT DISTINCT salary
9797
FROM Employee
98-
ORDER BY Salary DESC
99-
LIMIT 1 OFFSET 1
98+
ORDER BY salary DESC
99+
LIMIT 1, 1
100100
) AS SecondHighestSalary;
101101
```
102102

103103
```sql
104104
# Write your MySQL query statement below
105-
SELECT MAX(Salary) AS SecondHighestSalary
105+
SELECT MAX(salary) AS SecondHighestSalary
106106
FROM Employee
107-
WHERE
108-
Salary < (
109-
SELECT MAX(Salary)
110-
FROM Employee
111-
);
107+
WHERE salary < (SELECT MAX(salary) FROM Employee);
112108
```
113109

114110
```sql
115111
# Write your MySQL query statement below
116-
WITH
117-
S AS (
118-
SELECT salary, dense_rank() OVER (ORDER BY salary DESC) AS rk
119-
FROM Employee
120-
)
121-
SELECT
122-
ifnull(
123-
SELECT salary
124-
FROM S
125-
WHERE rk = 2
126-
LIMIT 1, NULL
127-
) AS SecondHighestSalary;
112+
WITH T AS (SELECT salary, DENSE_RANK() OVER (ORDER BY salary DESC) AS rk FROM Employee)
113+
SELECT (SELECT DISTINCT salary FROM T WHERE rk = 2) AS SecondHighestSalary;
128114
```
129115

130116
<!-- tabs:end -->

solution/0100-0199/0176.Second Highest Salary/README_EN.md

+7-21
Original file line numberDiff line numberDiff line change
@@ -78,38 +78,24 @@ Employee table:
7878
# Write your MySQL query statement below
7979
SELECT
8080
(
81-
SELECT DISTINCT Salary
81+
SELECT DISTINCT salary
8282
FROM Employee
83-
ORDER BY Salary DESC
84-
LIMIT 1 OFFSET 1
83+
ORDER BY salary DESC
84+
LIMIT 1, 1
8585
) AS SecondHighestSalary;
8686
```
8787

8888
```sql
8989
# Write your MySQL query statement below
90-
SELECT MAX(Salary) AS SecondHighestSalary
90+
SELECT MAX(salary) AS SecondHighestSalary
9191
FROM Employee
92-
WHERE
93-
Salary < (
94-
SELECT MAX(Salary)
95-
FROM Employee
96-
);
92+
WHERE salary < (SELECT MAX(salary) FROM Employee);
9793
```
9894

9995
```sql
10096
# Write your MySQL query statement below
101-
WITH
102-
S AS (
103-
SELECT salary, dense_rank() OVER (ORDER BY salary DESC) AS rk
104-
FROM Employee
105-
)
106-
SELECT
107-
ifnull(
108-
SELECT salary
109-
FROM S
110-
WHERE rk = 2
111-
LIMIT 1, NULL
112-
) AS SecondHighestSalary;
97+
WITH T AS (SELECT salary, DENSE_RANK() OVER (ORDER BY salary DESC) AS rk FROM Employee)
98+
SELECT (SELECT DISTINCT salary FROM T WHERE rk = 2) AS SecondHighestSalary;
11399
```
114100

115101
<!-- tabs:end -->
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,3 @@
11
# Write your MySQL query statement below
2-
SELECT
3-
(
4-
SELECT DISTINCT Salary
5-
FROM Employee
6-
ORDER BY Salary DESC
7-
LIMIT 1 OFFSET 1
8-
) AS SecondHighestSalary;
2+
WITH T AS (SELECT salary, DENSE_RANK() OVER (ORDER BY salary DESC) AS rk FROM Employee)
3+
SELECT (SELECT DISTINCT salary FROM T WHERE rk = 2) AS SecondHighestSalary;

solution/0100-0199/0177.Nth Highest Salary/README.md

+6-2
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,10 @@ n = 2
7070

7171
<!-- 这里可写通用的实现逻辑 -->
7272

73+
**方法一:排序 + LIMIT**
74+
75+
我们可以先对 `salary` 进行降序排序,然后使用 `LIMIT` 语句获取第 $n$ 高的工资。
76+
7377
<!-- tabs:start -->
7478

7579
### **SQL**
@@ -81,9 +85,9 @@ BEGIN
8185
RETURN (
8286
# Write your MySQL query statement below.
8387
SELECT (
84-
SELECT DISTINCT Salary
88+
SELECT DISTINCT salary
8589
FROM Employee
86-
ORDER BY Salary DESC
90+
ORDER BY salary DESC
8791
LIMIT 1 OFFSET N
8892
)
8993
);

solution/0100-0199/0177.Nth Highest Salary/README_EN.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -77,9 +77,9 @@ BEGIN
7777
RETURN (
7878
# Write your MySQL query statement below.
7979
SELECT (
80-
SELECT DISTINCT Salary
80+
SELECT DISTINCT salary
8181
FROM Employee
82-
ORDER BY Salary DESC
82+
ORDER BY salary DESC
8383
LIMIT 1 OFFSET N
8484
)
8585
);

solution/0100-0199/0177.Nth Highest Salary/Solution.sql

+2-2
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@ BEGIN
44
RETURN (
55
# Write your MySQL query statement below.
66
SELECT (
7-
SELECT DISTINCT Salary
7+
SELECT DISTINCT salary
88
FROM Employee
9-
ORDER BY Salary DESC
9+
ORDER BY salary DESC
1010
LIMIT 1 OFFSET N
1111
)
1212
);

solution/0100-0199/0178.Rank Scores/README.md

+10-10
Original file line numberDiff line numberDiff line change
@@ -66,9 +66,7 @@ Scores 表:
6666

6767
<!-- 这里可写通用的实现逻辑 -->
6868

69-
<!-- tabs:start -->
70-
71-
### **MySQL8**
69+
**方法一:使用窗口函数 `DENSE_RANK()`**
7270

7371
使用 `DENSE_RANK()` 函数,语法如下:
7472

@@ -86,20 +84,22 @@ DENSE_RANK() OVER (
8684

8785
`RANK()` 函数不同,`DENSE_RANK()` 函数始终返回连续的排名值。
8886

89-
题解如下:
87+
**方法二:变量**
88+
89+
MySQL 8 开始才提供了 `ROW_NUMBER()``RANK()``DENSE_RANK()`[窗口函数](https://dev.mysql.com/doc/refman/8.0/en/window-function-descriptions.html),在之前的版本,可以使用变量实现类似的功能。
90+
91+
<!-- tabs:start -->
92+
93+
### **SQL**
9094

9195
```sql
9296
# Write your MySQL query statement below
9397
SELECT
94-
Score,
95-
DENSE_RANK() OVER (ORDER BY Score DESC) AS 'Rank'
98+
score,
99+
DENSE_RANK() OVER (ORDER BY score DESC) AS 'rank'
96100
FROM Scores;
97101
```
98102

99-
### **MySQL5**
100-
101-
MySQL 8 开始才提供了 `ROW_NUMBER()``RANK()``DENSE_RANK()`[窗口函数](https://dev.mysql.com/doc/refman/8.0/en/window-function-descriptions.html),在之前的版本,可以使用变量实现类似的功能:
102-
103103
```sql
104104
SELECT
105105
Score,

solution/0100-0199/0178.Rank Scores/README_EN.md

+10-8
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ Scores table:
6464

6565
<!-- tabs:start -->
6666

67-
### **MySQL8**
67+
**Solution 1: Use `DENSE_RANK()`**
6868

6969
Use `DENSE_RANK()` to solve this problem.
7070

@@ -75,20 +75,22 @@ DENSE_RANK() OVER (
7575
)
7676
```
7777

78-
Solution:
78+
**Solution 2: Use variables**
79+
80+
MySQL only provides [window function](https://dev.mysql.com/doc/refman/8.0/en/window-function-descriptions.html) after version 8. In previous versions, variables can be used to achieve similar functions.
81+
82+
<!-- tabs:start -->
83+
84+
### **SQL**
7985

8086
```sql
8187
# Write your MySQL query statement below
8288
SELECT
83-
Score,
84-
DENSE_RANK() OVER (ORDER BY Score DESC) AS 'Rank'
89+
score,
90+
DENSE_RANK() OVER (ORDER BY score DESC) AS 'rank'
8591
FROM Scores;
8692
```
8793

88-
### **MySQL5**
89-
90-
MySQL only provides [window function](https://dev.mysql.com/doc/refman/8.0/en/window-function-descriptions.html) after version 8. In previous versions, variables can be used to achieve similar functions:
91-
9294
```sql
9395
SELECT
9496
Score,
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# Write your MySQL query statement below
22
SELECT
3-
Score,
4-
DENSE_RANK() OVER (ORDER BY Score DESC) AS 'Rank'
3+
score,
4+
DENSE_RANK() OVER (ORDER BY score DESC) AS 'rank'
55
FROM Scores;

0 commit comments

Comments
 (0)