auto commit

This commit is contained in:
CyC2018 2019-12-11 01:27:45 +08:00
parent 612d266233
commit de37d92168
2 changed files with 204 additions and 64 deletions

View File

@ -585,7 +585,10 @@ SELECT
FROM
Customers
WHERE
Id NOT IN ( SELECT CustomerId FROM Orders );
Id NOT IN (
SELECT CustomerId
FROM Orders
);
```
## SQL Schema
@ -666,7 +669,9 @@ SELECT
FROM
Employee E,
Department D,
( SELECT DepartmentId, MAX( Salary ) Salary FROM Employee GROUP BY DepartmentId ) M
( SELECT DepartmentId, MAX( Salary ) Salary
FROM Employee
GROUP BY DepartmentId ) M
WHERE
E.DepartmentId = D.Id
AND E.DepartmentId = M.DepartmentId
@ -727,7 +732,10 @@ https://leetcode.com/problems/second-highest-salary/description/
```sql
SELECT
( SELECT DISTINCT Salary FROM Employee ORDER BY Salary DESC LIMIT 1, 1 ) SecondHighestSalary;
( SELECT DISTINCT Salary
FROM Employee
ORDER BY Salary DESC
LIMIT 1, 1 ) SecondHighestSalary;
```
## SQL Schema
@ -756,7 +764,14 @@ VALUES
CREATE FUNCTION getNthHighestSalary ( N INT ) RETURNS INT BEGIN
SET N = N - 1;
RETURN ( SELECT ( SELECT DISTINCT Salary FROM Employee ORDER BY Salary DESC LIMIT N, 1 ) );
RETURN (
SELECT (
SELECT DISTINCT Salary
FROM Employee
ORDER BY Salary DESC
LIMIT N, 1
)
);
END
```
@ -804,38 +819,93 @@ https://leetcode.com/problems/rank-scores/description/
## Solution
要统计某个 score 的排名只要统计大于 score score 数量然后加 1
要统计某个 score 的排名只要统计大于等于 score score 数量
| score | 于该 score score 数量 | 排名 |
| :---: | :---: | :---: |
| 4.1 | 2 | 3 |
| 4.2 | 1 | 2 |
| 4.3 | 0 | 1 |
| Id | score | 于等于该 score score 数量 | 排名 |
| :---: | :---: | :---: | :---: |
| 1 | 4.1 | 3 | 3 |
| 2 | 4.2 | 2 | 2 |
| 3 | 4.3 | 1 | 1 |
但是在本题中相同的 score 只算一个排名
使用连接操作找到某个 score 对应的大于其值的记录
| score | 排名 |
```sql
SELECT
*
FROM
Scores S1
INNER JOIN Scores S2
ON S1.score <= S2.score
ORDER BY
S1.score DESC, S1.Id;
```
| S1.Id | S1.score | S2.Id | S2.score |
| :---: | :---: | :---: | :---: |
|3| 4.3| 3 |4.3|
|2| 4.2| 2| 4.2|
|2| 4.2 |3 |4.3|
|1| 4.1 |1| 4.1|
|1| 4.1 |2| 4.2|
|1| 4.1 |3| 4.3|
可以看到每个 S1.score 都有对应好几条记录我们再进行分组并统计每个分组的数量作为 'Rank'
```sql
SELECT
S1.score 'Score',
COUNT(*) 'Rank'
FROM
Scores S1
INNER JOIN Scores S2
ON S1.score <= S2.score
GROUP BY
S1.id, S1.score
ORDER BY
S1.score DESC, S1.Id;
```
| score | Rank |
| :---: | :---: |
| 4.1 | 3 |
| 4.1 | 3 |
| 4.2 | 2 |
| 4.2 | 2 |
| 4.3 | 1 |
| 4.3 | 1 |
| 4.2 | 2 |
| 4.1 | 3 |
可以按 score 进行分组将同一个分组中的 score 只当成一个
上面的解法看似没问题但是对于以下数据它却得到了错误的结果
但是如果分组字段只有 score 的话那么相同的 score 最后的结果只会有一个例如上面的 6 个记录最后只取出 3
| score | 排名 |
| Id | score |
| :---: | :---: |
| 4.1 | 3 |
| 4.2 | 2 |
| 4.3 | 1 |
| 1 | 4.1 |
| 2 | 4.2 |
| 3 | 4.2 |
所以在分组中需要加入 Id每个记录显示一个结果综上需要使用 score id 两个分组字段
| score | Rank |
| :---: | :--: |
| 4.2 | 2 |
| 4.2 | 2 |
| 4.1 | 3 |
在下面的实现中首先将 Scores 表根据 score 字段进行自连接得到一个新表然后在新表上对 id score 进行分组
而我们希望的结果为
| score | Rank |
| :---: | :--: |
| 4.2 | 1 |
| 4.2 | 2 |
| 4.1 | 2 |
连接情况如下
| S1.Id | S1.score | S2.Id | S2.score |
| :---: | :------: | :---: | :------: |
| 2 | 4.2 | 3 | 4.2 |
| 2 | 4.2 | 2 | 4.2 |
| 3 | 4.2 | 3 | 4.2 |
| 3 | 4.2 | 2 | 4.1 |
| 1 | 4.1 | 3 | 4.2 |
| 1 | 4.1 | 2 | 4.3 |
| 1 | 4.1 | 1 | 4.1 |
我们想要的结果是把分数相同的放在同一个排名并且相同分数只占一个位置例如上面的分数Id=2 Id=3 的记录都有相同的分数并且最高他们并列第一 Id=1 的记录应该排第二名而不是第三名所以在进行 COUNT 计数统计时我们需要使用 COUNT( DISTINCT S2.score ) 从而只统计一次相同的分数
```sql
SELECT
@ -860,12 +930,12 @@ IF
CREATE TABLE Scores ( Id INT, Score DECIMAL ( 3, 2 ) );
INSERT INTO Scores ( Id, Score )
VALUES
( 1, 3.5 ),
( 2, 3.65 ),
( 3, 4.0 ),
( 4, 3.85 ),
( 5, 4.0 ),
( 6, 3.65 );
( 1, 4.1 ),
( 2, 4.1 ),
( 3, 4.2 ),
( 4, 4.2 ),
( 5, 4.3 ),
( 6, 4.3 );
```
# 180. Consecutive Numbers

View File

@ -585,7 +585,10 @@ SELECT
FROM
Customers
WHERE
Id NOT IN ( SELECT CustomerId FROM Orders );
Id NOT IN (
SELECT CustomerId
FROM Orders
);
```
## SQL Schema
@ -666,7 +669,9 @@ SELECT
FROM
Employee E,
Department D,
( SELECT DepartmentId, MAX( Salary ) Salary FROM Employee GROUP BY DepartmentId ) M
( SELECT DepartmentId, MAX( Salary ) Salary
FROM Employee
GROUP BY DepartmentId ) M
WHERE
E.DepartmentId = D.Id
AND E.DepartmentId = M.DepartmentId
@ -727,7 +732,10 @@ https://leetcode.com/problems/second-highest-salary/description/
```sql
SELECT
( SELECT DISTINCT Salary FROM Employee ORDER BY Salary DESC LIMIT 1, 1 ) SecondHighestSalary;
( SELECT DISTINCT Salary
FROM Employee
ORDER BY Salary DESC
LIMIT 1, 1 ) SecondHighestSalary;
```
## SQL Schema
@ -756,7 +764,14 @@ VALUES
CREATE FUNCTION getNthHighestSalary ( N INT ) RETURNS INT BEGIN
SET N = N - 1;
RETURN ( SELECT ( SELECT DISTINCT Salary FROM Employee ORDER BY Salary DESC LIMIT N, 1 ) );
RETURN (
SELECT (
SELECT DISTINCT Salary
FROM Employee
ORDER BY Salary DESC
LIMIT N, 1
)
);
END
```
@ -804,38 +819,93 @@ https://leetcode.com/problems/rank-scores/description/
## Solution
要统计某个 score 的排名只要统计大于 score score 数量然后加 1
要统计某个 score 的排名只要统计大于等于 score score 数量
| score | 于该 score score 数量 | 排名 |
| :---: | :---: | :---: |
| 4.1 | 2 | 3 |
| 4.2 | 1 | 2 |
| 4.3 | 0 | 1 |
| Id | score | 于等于该 score score 数量 | 排名 |
| :---: | :---: | :---: | :---: |
| 1 | 4.1 | 3 | 3 |
| 2 | 4.2 | 2 | 2 |
| 3 | 4.3 | 1 | 1 |
但是在本题中相同的 score 只算一个排名
使用连接操作找到某个 score 对应的大于其值的记录
| score | 排名 |
```sql
SELECT
*
FROM
Scores S1
INNER JOIN Scores S2
ON S1.score <= S2.score
ORDER BY
S1.score DESC, S1.Id;
```
| S1.Id | S1.score | S2.Id | S2.score |
| :---: | :---: | :---: | :---: |
|3| 4.3| 3 |4.3|
|2| 4.2| 2| 4.2|
|2| 4.2 |3 |4.3|
|1| 4.1 |1| 4.1|
|1| 4.1 |2| 4.2|
|1| 4.1 |3| 4.3|
可以看到每个 S1.score 都有对应好几条记录我们再进行分组并统计每个分组的数量作为 'Rank'
```sql
SELECT
S1.score 'Score',
COUNT(*) 'Rank'
FROM
Scores S1
INNER JOIN Scores S2
ON S1.score <= S2.score
GROUP BY
S1.id, S1.score
ORDER BY
S1.score DESC, S1.Id;
```
| score | Rank |
| :---: | :---: |
| 4.1 | 3 |
| 4.1 | 3 |
| 4.2 | 2 |
| 4.2 | 2 |
| 4.3 | 1 |
| 4.3 | 1 |
| 4.2 | 2 |
| 4.1 | 3 |
可以按 score 进行分组将同一个分组中的 score 只当成一个
上面的解法看似没问题但是对于以下数据它却得到了错误的结果
但是如果分组字段只有 score 的话那么相同的 score 最后的结果只会有一个例如上面的 6 个记录最后只取出 3
| score | 排名 |
| Id | score |
| :---: | :---: |
| 4.1 | 3 |
| 4.2 | 2 |
| 4.3 | 1 |
| 1 | 4.1 |
| 2 | 4.2 |
| 3 | 4.2 |
所以在分组中需要加入 Id每个记录显示一个结果综上需要使用 score id 两个分组字段
| score | Rank |
| :---: | :--: |
| 4.2 | 2 |
| 4.2 | 2 |
| 4.1 | 3 |
在下面的实现中首先将 Scores 表根据 score 字段进行自连接得到一个新表然后在新表上对 id score 进行分组
而我们希望的结果为
| score | Rank |
| :---: | :--: |
| 4.2 | 1 |
| 4.2 | 2 |
| 4.1 | 2 |
连接情况如下
| S1.Id | S1.score | S2.Id | S2.score |
| :---: | :------: | :---: | :------: |
| 2 | 4.2 | 3 | 4.2 |
| 2 | 4.2 | 2 | 4.2 |
| 3 | 4.2 | 3 | 4.2 |
| 3 | 4.2 | 2 | 4.1 |
| 1 | 4.1 | 3 | 4.2 |
| 1 | 4.1 | 2 | 4.3 |
| 1 | 4.1 | 1 | 4.1 |
我们想要的结果是把分数相同的放在同一个排名并且相同分数只占一个位置例如上面的分数Id=2 Id=3 的记录都有相同的分数并且最高他们并列第一 Id=1 的记录应该排第二名而不是第三名所以在进行 COUNT 计数统计时我们需要使用 COUNT( DISTINCT S2.score ) 从而只统计一次相同的分数
```sql
SELECT
@ -860,12 +930,12 @@ IF
CREATE TABLE Scores ( Id INT, Score DECIMAL ( 3, 2 ) );
INSERT INTO Scores ( Id, Score )
VALUES
( 1, 3.5 ),
( 2, 3.65 ),
( 3, 4.0 ),
( 4, 3.85 ),
( 5, 4.0 ),
( 6, 3.65 );
( 1, 4.1 ),
( 2, 4.1 ),
( 3, 4.2 ),
( 4, 4.2 ),
( 5, 4.3 ),
( 6, 4.3 );
```
# 180. Consecutive Numbers