Skip to content

Commit b9f98f0

Browse files
authored
feat: add sql solutions to lc problems (#1173)
1 parent ee318ae commit b9f98f0

File tree

15 files changed

+242
-75
lines changed

15 files changed

+242
-75
lines changed

.prettierignore

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,4 +27,6 @@ node_modules/
2727
/solution/1700-1799/1767.Find the Subtasks That Did Not Execute/Solution.sql
2828
/solution/2100-2199/2118.Build the Equation/Solution.sql
2929
/solution/2100-2199/2153.The Number of Passengers in Each Bus II/Solution.sql
30-
/solution/2200-2299/2205.The Number of Users That Are Eligible for Discount/Solution.sql
30+
/solution/2200-2299/2205.The Number of Users That Are Eligible for Discount/Solution.sql
31+
/solution/2200-2299/2252.Dynamic Pivoting of a Table/Solution.sql
32+
/solution/2200-2299/2253.Dynamic Unpivoting of a Table/Solution.sql

solution/0100-0199/0175.Combine Two Tables/README.md

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -80,20 +80,18 @@ addressId = 1 包含了 personId = 2 的地址信息。</pre>
8080

8181
**方法一:左连接**
8282

83+
我们可以使用左连接,将 `Person` 表左连接 `Address` 表,连接条件为 `Person.personId = Address.personId`,这样就可以得到每个人的姓、名、城市和州。如果 `personId` 的地址不在 `Address` 表中,则报告为空 `null`
84+
8385
<!-- tabs:start -->
8486

8587
### **SQL**
8688

8789
```sql
8890
# Write your MySQL query statement below
89-
SELECT
90-
firstName,
91-
lastName,
92-
city,
93-
state
91+
SELECT firstName, lastName, city, state
9492
FROM
95-
Person AS p
96-
LEFT JOIN Address AS a ON p.personId = a.personId;
93+
Person
94+
LEFT JOIN Address USING (personId);
9795
```
9896

9997
<!-- tabs:end -->

solution/0100-0199/0175.Combine Two Tables/README_EN.md

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -82,14 +82,10 @@ addressId = 1 contains information about the address of personId = 2.
8282

8383
```sql
8484
# Write your MySQL query statement below
85-
SELECT
86-
firstName,
87-
lastName,
88-
city,
89-
state
85+
SELECT firstName, lastName, city, state
9086
FROM
91-
Person AS p
92-
LEFT JOIN Address AS a ON p.personId = a.personId;
87+
Person
88+
LEFT JOIN Address USING (personId);
9389
```
9490

9591
<!-- tabs:end -->
Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,5 @@
11
# Write your MySQL query statement below
2-
SELECT
3-
firstName,
4-
lastName,
5-
city,
6-
state
2+
SELECT firstName, lastName, city, state
73
FROM
8-
Person AS p
9-
LEFT JOIN Address AS a ON p.personId = a.personId;
4+
Person
5+
LEFT JOIN Address USING (personId);

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

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -73,12 +73,22 @@ Employee 表:
7373

7474
<!-- 这里可写通用的实现逻辑 -->
7575

76+
**方法一:使用 LIMIT 语句和子查询**
77+
78+
我们可以按照薪水降序排列,然后使用 `LIMIT` 语句来获取第二高的薪水,如果不存在第二高的薪水,那么就返回 `null`
79+
80+
**方法二:使用 MAX() 函数和子查询**
81+
82+
使用 `MAX()` 函数,从小于 `MAX()` 的 Salary 中挑选最大值 `MAX()` 即可。
83+
84+
**方法三:使用 IFNULL() 和窗口函数**
85+
86+
我们也可以先通过 `dense_rank()` 函数计算出每个员工的薪水排名,然后再筛选出排名为 $2$ 的员工即可,如果不存在第二高的薪水,那么就返回 `null`
87+
7688
<!-- tabs:start -->
7789

7890
### **SQL**
7991

80-
解法 1:使用 LIMIT 语句和子查询。
81-
8292
```sql
8393
# Write your MySQL query statement below
8494
SELECT
@@ -90,8 +100,6 @@ SELECT
90100
) AS SecondHighestSalary;
91101
```
92102

93-
解法 2:使用 `MAX()` 函数,从小于 `MAX()` 的 Salary 中挑选最大值 `MAX()` 即可。
94-
95103
```sql
96104
# Write your MySQL query statement below
97105
SELECT MAX(Salary) AS SecondHighestSalary
@@ -103,4 +111,20 @@ WHERE
103111
);
104112
```
105113

114+
```sql
115+
# 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;
128+
```
129+
106130
<!-- tabs:end -->

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

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -64,12 +64,16 @@ Employee table:
6464

6565
## Solutions
6666

67+
**Solution 1: Use Sub Query and LIMIT**
68+
69+
**Solution 2: Use `MAX()` function**
70+
71+
**Solution 3: Use `IFNULL()` and window function**
72+
6773
<!-- tabs:start -->
6874

6975
### **SQL**
7076

71-
Solution 1: Use Sub Query and LIMIT.
72-
7377
```sql
7478
# Write your MySQL query statement below
7579
SELECT
@@ -81,8 +85,6 @@ SELECT
8185
) AS SecondHighestSalary;
8286
```
8387

84-
Solution 2: Use `MAX()` function.
85-
8688
```sql
8789
# Write your MySQL query statement below
8890
SELECT MAX(Salary) AS SecondHighestSalary
@@ -94,4 +96,20 @@ WHERE
9496
);
9597
```
9698

99+
```sql
100+
# 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;
113+
```
114+
97115
<!-- tabs:end -->

solution/0100-0199/0180.Consecutive Numbers/README.md

Lines changed: 15 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -60,26 +60,23 @@ Result 表:
6060

6161
### **SQL**
6262

63-
```sql
64-
SELECT DISTINCT (Num) AS ConsecutiveNums
65-
FROM Logs AS Curr
66-
WHERE
67-
Num = (SELECT Num FROM Logs WHERE id = Curr.id - 1)
68-
AND Num = (SELECT Num FROM Logs WHERE id = Curr.id - 2);
69-
```
70-
7163
```sql
7264
# Write your MySQL query statement below
73-
SELECT DISTINCT l1.num AS ConsecutiveNums
74-
FROM
75-
logs AS l1,
76-
logs AS l2,
77-
logs AS l3
78-
WHERE
79-
l1.id = l2.id - 1
80-
AND l2.id = l3.id - 1
81-
AND l1.num = l2.num
82-
AND l2.num = l3.num;
65+
WITH
66+
t AS (
67+
SELECT
68+
*,
69+
CASE
70+
WHEN (lag(num) OVER (ORDER BY id)) = num THEN 0
71+
ELSE 1
72+
END AS mark
73+
FROM Logs
74+
),
75+
p AS (SELECT num, sum(mark) OVER (ORDER BY id) AS gid FROM t)
76+
SELECT DISTINCT num AS ConsecutiveNums
77+
FROM p
78+
GROUP BY gid
79+
HAVING count(1) >= 3;
8380
```
8481

8582
<!-- tabs:end -->

solution/0100-0199/0180.Consecutive Numbers/README_EN.md

Lines changed: 15 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -57,26 +57,23 @@ Logs table:
5757

5858
### **SQL**
5959

60-
```sql
61-
SELECT DISTINCT (Num) AS ConsecutiveNums
62-
FROM Logs AS Curr
63-
WHERE
64-
Num = (SELECT Num FROM Logs WHERE id = Curr.id - 1)
65-
AND Num = (SELECT Num FROM Logs WHERE id = Curr.id - 2);
66-
```
67-
6860
```sql
6961
# Write your MySQL query statement below
70-
SELECT DISTINCT l1.num AS ConsecutiveNums
71-
FROM
72-
logs AS l1,
73-
logs AS l2,
74-
logs AS l3
75-
WHERE
76-
l1.id = l2.id - 1
77-
AND l2.id = l3.id - 1
78-
AND l1.num = l2.num
79-
AND l2.num = l3.num;
62+
WITH
63+
t AS (
64+
SELECT
65+
*,
66+
CASE
67+
WHEN (lag(num) OVER (ORDER BY id)) = num THEN 0
68+
ELSE 1
69+
END AS mark
70+
FROM Logs
71+
),
72+
p AS (SELECT num, sum(mark) OVER (ORDER BY id) AS gid FROM t)
73+
SELECT DISTINCT num AS ConsecutiveNums
74+
FROM p
75+
GROUP BY gid
76+
HAVING count(1) >= 3;
8077
```
8178

8279
<!-- tabs:end -->
Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,16 @@
1-
SELECT DISTINCT (Num) AS ConsecutiveNums
2-
FROM Logs AS Curr
3-
WHERE
4-
Num = (SELECT Num FROM Logs WHERE id = Curr.id - 1)
5-
AND Num = (SELECT Num FROM Logs WHERE id = Curr.id - 2);
1+
# Write your MySQL query statement below
2+
WITH
3+
t AS (
4+
SELECT
5+
*,
6+
CASE
7+
WHEN (lag(num) OVER (ORDER BY id)) = num THEN 0
8+
ELSE 1
9+
END AS mark
10+
FROM Logs
11+
),
12+
p AS (SELECT num, sum(mark) OVER (ORDER BY id) AS gid FROM t)
13+
SELECT DISTINCT num AS ConsecutiveNums
14+
FROM p
15+
GROUP BY gid
16+
HAVING count(1) >= 3;

solution/2200-2299/2252.Dynamic Pivoting of a Table/README.md

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,23 @@ Products 表:
7676
<!-- 这里可写当前语言的特殊实现逻辑 -->
7777

7878
```sql
79-
79+
CREATE PROCEDURE PivotProducts()
80+
BEGIN
81+
# Write your MySQL query statement below.
82+
SET group_concat_max_len = 5000;
83+
SELECT GROUP_CONCAT(DISTINCT 'MAX(CASE WHEN store = \'',
84+
store,
85+
'\' THEN price ELSE NULL END) AS ',
86+
store
87+
ORDER BY store) INTO @sql
88+
FROM Products;
89+
SET @sql = CONCAT('SELECT product_id, ',
90+
@sql,
91+
' FROM Products GROUP BY product_id');
92+
PREPARE stmt FROM @sql;
93+
EXECUTE stmt;
94+
DEALLOCATE PREPARE stmt;
95+
END
8096
```
8197

8298
<!-- tabs:end -->

0 commit comments

Comments
 (0)