Skip to content

Commit de37d92

Browse files
committed
auto commit
1 parent 612d266 commit de37d92

File tree

2 files changed

+204
-64
lines changed

2 files changed

+204
-64
lines changed

docs/notes/Leetcode-Database 题解.md

Lines changed: 102 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -585,7 +585,10 @@ SELECT
585585
FROM
586586
Customers
587587
WHERE
588-
Id NOT IN ( SELECT CustomerId FROM Orders );
588+
Id NOT IN (
589+
SELECT CustomerId
590+
FROM Orders
591+
);
589592
```
590593

591594
## SQL Schema
@@ -666,7 +669,9 @@ SELECT
666669
FROM
667670
Employee E,
668671
Department D,
669-
( SELECT DepartmentId, MAX( Salary ) Salary FROM Employee GROUP BY DepartmentId ) M
672+
( SELECT DepartmentId, MAX( Salary ) Salary
673+
FROM Employee
674+
GROUP BY DepartmentId ) M
670675
WHERE
671676
E.DepartmentId = D.Id
672677
AND E.DepartmentId = M.DepartmentId
@@ -727,7 +732,10 @@ https://leetcode.com/problems/second-highest-salary/description/
727732

728733
```sql
729734
SELECT
730-
( SELECT DISTINCT Salary FROM Employee ORDER BY Salary DESC LIMIT 1, 1 ) SecondHighestSalary;
735+
( SELECT DISTINCT Salary
736+
FROM Employee
737+
ORDER BY Salary DESC
738+
LIMIT 1, 1 ) SecondHighestSalary;
731739
```
732740

733741
## SQL Schema
@@ -756,7 +764,14 @@ VALUES
756764
CREATE FUNCTION getNthHighestSalary ( N INT ) RETURNS INT BEGIN
757765

758766
SET N = N - 1;
759-
RETURN ( SELECT ( SELECT DISTINCT Salary FROM Employee ORDER BY Salary DESC LIMIT N, 1 ) );
767+
RETURN (
768+
SELECT (
769+
SELECT DISTINCT Salary
770+
FROM Employee
771+
ORDER BY Salary DESC
772+
LIMIT N, 1
773+
)
774+
);
760775

761776
END
762777
```
@@ -804,38 +819,93 @@ https://leetcode.com/problems/rank-scores/description/
804819

805820
## Solution
806821

807-
要统计某个 score 的排名,只要统计大于该 score 的 score 数量,然后加 1
822+
要统计某个 score 的排名,只要统计大于等于该 score 的 score 数量。
808823

809-
| score | 大于该 score 的 score 数量 | 排名 |
810-
| :---: | :---: | :---: |
811-
| 4.1 | 2 | 3 |
812-
| 4.2 | 1 | 2 |
813-
| 4.3 | 0 | 1 |
824+
| Id | score | 大于等于该 score 的 score 数量 | 排名 |
825+
| :---: | :---: | :---: | :---: |
826+
| 1 | 4.1 | 3 | 3 |
827+
| 2 | 4.2 | 2 | 2 |
828+
| 3 | 4.3 | 1 | 1 |
814829

815-
但是在本题中,相同的 score 只算一个排名
830+
使用连接操作找到某个 score 对应的大于其值的记录
816831

817-
| score | 排名 |
818-
| :---: | :---: |
819-
| 4.1 | 3 |
820-
| 4.1 | 3 |
821-
| 4.2 | 2 |
822-
| 4.2 | 2 |
823-
| 4.3 | 1 |
824-
| 4.3 | 1 |
832+
```sql
833+
SELECT
834+
*
835+
FROM
836+
Scores S1
837+
INNER JOIN Scores S2
838+
ON S1.score <= S2.score
839+
ORDER BY
840+
S1.score DESC, S1.Id;
841+
```
825842

826-
可以按 score 进行分组,将同一个分组中的 score 只当成一个。
843+
| S1.Id | S1.score | S2.Id | S2.score |
844+
| :---: | :---: | :---: | :---: |
845+
|3| 4.3| 3 |4.3|
846+
|2| 4.2| 2| 4.2|
847+
|2| 4.2 |3 |4.3|
848+
|1| 4.1 |1| 4.1|
849+
|1| 4.1 |2| 4.2|
850+
|1| 4.1 |3| 4.3|
827851

828-
但是如果分组字段只有 score 的话,那么相同的 score 最后的结果只会有一个,例如上面的 6 个记录最后只取出 3 个。
852+
可以看到每个 S1.score 都有对应好几条记录,我们再进行分组,并统计每个分组的数量作为 'Rank'
829853

830-
| score | 排名 |
854+
```sql
855+
SELECT
856+
S1.score 'Score',
857+
COUNT(*) 'Rank'
858+
FROM
859+
Scores S1
860+
INNER JOIN Scores S2
861+
ON S1.score <= S2.score
862+
GROUP BY
863+
S1.id, S1.score
864+
ORDER BY
865+
S1.score DESC, S1.Id;
866+
```
867+
868+
| score | Rank |
831869
| :---: | :---: |
832-
| 4.1 | 3 |
833-
| 4.2 | 2 |
834870
| 4.3 | 1 |
871+
| 4.2 | 2 |
872+
| 4.1 | 3 |
835873

836-
所以在分组中需要加入 Id,每个记录显示一个结果。综上,需要使用 score 和 id 两个分组字段。
874+
上面的解法看似没问题,但是对于以下数据,它却得到了错误的结果:
837875

838-
在下面的实现中,首先将 Scores 表根据 score 字段进行自连接,得到一个新表,然后在新表上对 id 和 score 进行分组。
876+
| Id | score |
877+
| :---: | :---: |
878+
| 1 | 4.1 |
879+
| 2 | 4.2 |
880+
| 3 | 4.2 |
881+
882+
| score | Rank |
883+
| :---: | :--: |
884+
| 4.2 | 2 |
885+
| 4.2 | 2 |
886+
| 4.1 | 3 |
887+
888+
而我们希望的结果为:
889+
890+
| score | Rank |
891+
| :---: | :--: |
892+
| 4.2 | 1 |
893+
| 4.2 | 2 |
894+
| 4.1 | 2 |
895+
896+
连接情况如下:
897+
898+
| S1.Id | S1.score | S2.Id | S2.score |
899+
| :---: | :------: | :---: | :------: |
900+
| 2 | 4.2 | 3 | 4.2 |
901+
| 2 | 4.2 | 2 | 4.2 |
902+
| 3 | 4.2 | 3 | 4.2 |
903+
| 3 | 4.2 | 2 | 4.1 |
904+
| 1 | 4.1 | 3 | 4.2 |
905+
| 1 | 4.1 | 2 | 4.3 |
906+
| 1 | 4.1 | 1 | 4.1 |
907+
908+
我们想要的结果是,把分数相同的放在同一个排名,并且相同分数只占一个位置,例如上面的分数,Id=2 和 Id=3 的记录都有相同的分数,并且最高,他们并列第一。而 Id=1 的记录应该排第二名,而不是第三名。所以在进行 COUNT 计数统计时,我们需要使用 COUNT( DISTINCT S2.score ) 从而只统计一次相同的分数。
839909

840910
```sql
841911
SELECT
@@ -860,12 +930,12 @@ IF
860930
CREATE TABLE Scores ( Id INT, Score DECIMAL ( 3, 2 ) );
861931
INSERT INTO Scores ( Id, Score )
862932
VALUES
863-
( 1, 3.5 ),
864-
( 2, 3.65 ),
865-
( 3, 4.0 ),
866-
( 4, 3.85 ),
867-
( 5, 4.0 ),
868-
( 6, 3.65 );
933+
( 1, 4.1 ),
934+
( 2, 4.1 ),
935+
( 3, 4.2 ),
936+
( 4, 4.2 ),
937+
( 5, 4.3 ),
938+
( 6, 4.3 );
869939
```
870940

871941
# 180. Consecutive Numbers

notes/Leetcode-Database 题解.md

Lines changed: 102 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -585,7 +585,10 @@ SELECT
585585
FROM
586586
Customers
587587
WHERE
588-
Id NOT IN ( SELECT CustomerId FROM Orders );
588+
Id NOT IN (
589+
SELECT CustomerId
590+
FROM Orders
591+
);
589592
```
590593

591594
## SQL Schema
@@ -666,7 +669,9 @@ SELECT
666669
FROM
667670
Employee E,
668671
Department D,
669-
( SELECT DepartmentId, MAX( Salary ) Salary FROM Employee GROUP BY DepartmentId ) M
672+
( SELECT DepartmentId, MAX( Salary ) Salary
673+
FROM Employee
674+
GROUP BY DepartmentId ) M
670675
WHERE
671676
E.DepartmentId = D.Id
672677
AND E.DepartmentId = M.DepartmentId
@@ -727,7 +732,10 @@ https://leetcode.com/problems/second-highest-salary/description/
727732

728733
```sql
729734
SELECT
730-
( SELECT DISTINCT Salary FROM Employee ORDER BY Salary DESC LIMIT 1, 1 ) SecondHighestSalary;
735+
( SELECT DISTINCT Salary
736+
FROM Employee
737+
ORDER BY Salary DESC
738+
LIMIT 1, 1 ) SecondHighestSalary;
731739
```
732740

733741
## SQL Schema
@@ -756,7 +764,14 @@ VALUES
756764
CREATE FUNCTION getNthHighestSalary ( N INT ) RETURNS INT BEGIN
757765

758766
SET N = N - 1;
759-
RETURN ( SELECT ( SELECT DISTINCT Salary FROM Employee ORDER BY Salary DESC LIMIT N, 1 ) );
767+
RETURN (
768+
SELECT (
769+
SELECT DISTINCT Salary
770+
FROM Employee
771+
ORDER BY Salary DESC
772+
LIMIT N, 1
773+
)
774+
);
760775

761776
END
762777
```
@@ -804,38 +819,93 @@ https://leetcode.com/problems/rank-scores/description/
804819

805820
## Solution
806821

807-
要统计某个 score 的排名,只要统计大于该 score 的 score 数量,然后加 1
822+
要统计某个 score 的排名,只要统计大于等于该 score 的 score 数量。
808823

809-
| score | 大于该 score 的 score 数量 | 排名 |
810-
| :---: | :---: | :---: |
811-
| 4.1 | 2 | 3 |
812-
| 4.2 | 1 | 2 |
813-
| 4.3 | 0 | 1 |
824+
| Id | score | 大于等于该 score 的 score 数量 | 排名 |
825+
| :---: | :---: | :---: | :---: |
826+
| 1 | 4.1 | 3 | 3 |
827+
| 2 | 4.2 | 2 | 2 |
828+
| 3 | 4.3 | 1 | 1 |
814829

815-
但是在本题中,相同的 score 只算一个排名
830+
使用连接操作找到某个 score 对应的大于其值的记录
816831

817-
| score | 排名 |
818-
| :---: | :---: |
819-
| 4.1 | 3 |
820-
| 4.1 | 3 |
821-
| 4.2 | 2 |
822-
| 4.2 | 2 |
823-
| 4.3 | 1 |
824-
| 4.3 | 1 |
832+
```sql
833+
SELECT
834+
*
835+
FROM
836+
Scores S1
837+
INNER JOIN Scores S2
838+
ON S1.score <= S2.score
839+
ORDER BY
840+
S1.score DESC, S1.Id;
841+
```
825842

826-
可以按 score 进行分组,将同一个分组中的 score 只当成一个。
843+
| S1.Id | S1.score | S2.Id | S2.score |
844+
| :---: | :---: | :---: | :---: |
845+
|3| 4.3| 3 |4.3|
846+
|2| 4.2| 2| 4.2|
847+
|2| 4.2 |3 |4.3|
848+
|1| 4.1 |1| 4.1|
849+
|1| 4.1 |2| 4.2|
850+
|1| 4.1 |3| 4.3|
827851

828-
但是如果分组字段只有 score 的话,那么相同的 score 最后的结果只会有一个,例如上面的 6 个记录最后只取出 3 个。
852+
可以看到每个 S1.score 都有对应好几条记录,我们再进行分组,并统计每个分组的数量作为 'Rank'
829853

830-
| score | 排名 |
854+
```sql
855+
SELECT
856+
S1.score 'Score',
857+
COUNT(*) 'Rank'
858+
FROM
859+
Scores S1
860+
INNER JOIN Scores S2
861+
ON S1.score <= S2.score
862+
GROUP BY
863+
S1.id, S1.score
864+
ORDER BY
865+
S1.score DESC, S1.Id;
866+
```
867+
868+
| score | Rank |
831869
| :---: | :---: |
832-
| 4.1 | 3 |
833-
| 4.2 | 2 |
834870
| 4.3 | 1 |
871+
| 4.2 | 2 |
872+
| 4.1 | 3 |
835873

836-
所以在分组中需要加入 Id,每个记录显示一个结果。综上,需要使用 score 和 id 两个分组字段。
874+
上面的解法看似没问题,但是对于以下数据,它却得到了错误的结果:
837875

838-
在下面的实现中,首先将 Scores 表根据 score 字段进行自连接,得到一个新表,然后在新表上对 id 和 score 进行分组。
876+
| Id | score |
877+
| :---: | :---: |
878+
| 1 | 4.1 |
879+
| 2 | 4.2 |
880+
| 3 | 4.2 |
881+
882+
| score | Rank |
883+
| :---: | :--: |
884+
| 4.2 | 2 |
885+
| 4.2 | 2 |
886+
| 4.1 | 3 |
887+
888+
而我们希望的结果为:
889+
890+
| score | Rank |
891+
| :---: | :--: |
892+
| 4.2 | 1 |
893+
| 4.2 | 2 |
894+
| 4.1 | 2 |
895+
896+
连接情况如下:
897+
898+
| S1.Id | S1.score | S2.Id | S2.score |
899+
| :---: | :------: | :---: | :------: |
900+
| 2 | 4.2 | 3 | 4.2 |
901+
| 2 | 4.2 | 2 | 4.2 |
902+
| 3 | 4.2 | 3 | 4.2 |
903+
| 3 | 4.2 | 2 | 4.1 |
904+
| 1 | 4.1 | 3 | 4.2 |
905+
| 1 | 4.1 | 2 | 4.3 |
906+
| 1 | 4.1 | 1 | 4.1 |
907+
908+
我们想要的结果是,把分数相同的放在同一个排名,并且相同分数只占一个位置,例如上面的分数,Id=2 和 Id=3 的记录都有相同的分数,并且最高,他们并列第一。而 Id=1 的记录应该排第二名,而不是第三名。所以在进行 COUNT 计数统计时,我们需要使用 COUNT( DISTINCT S2.score ) 从而只统计一次相同的分数。
839909

840910
```sql
841911
SELECT
@@ -860,12 +930,12 @@ IF
860930
CREATE TABLE Scores ( Id INT, Score DECIMAL ( 3, 2 ) );
861931
INSERT INTO Scores ( Id, Score )
862932
VALUES
863-
( 1, 3.5 ),
864-
( 2, 3.65 ),
865-
( 3, 4.0 ),
866-
( 4, 3.85 ),
867-
( 5, 4.0 ),
868-
( 6, 3.65 );
933+
( 1, 4.1 ),
934+
( 2, 4.1 ),
935+
( 3, 4.2 ),
936+
( 4, 4.2 ),
937+
( 5, 4.3 ),
938+
( 6, 4.3 );
869939
```
870940

871941
# 180. Consecutive Numbers

0 commit comments

Comments
 (0)