Skip to content

Commit 04aa7be

Browse files
authored
feat: add sql solution to lc problem: No.2388 (doocs#1145)
No.2388.Change Null Values in a Table to the Previous Value
1 parent 1f9f231 commit 04aa7be

File tree

3 files changed

+100
-0
lines changed

3 files changed

+100
-0
lines changed

solution/2300-2399/2388.Change Null Values in a Table to the Previous Value/README.md

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,14 +66,56 @@ CoffeeShop 表:
6666

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

69+
**方法一:临时变量**
70+
71+
我们可以使用一个临时变量 $cur$ 来记录上一个不为 $null$ 的值,如果当前值为 $null$,则将 $cur$ 的值赋给当前值,否则我们更新 $cur$ 的值为当前值。
72+
73+
**方法二:窗口函数**
74+
75+
我们先用窗口函数 `row_number()` 为每一行生成一个序号,然后使用 `sum()` 窗口函数来生成一个分组序号,分组序号的生成规则为:如果当前行的值为 $null$,则分组序号与上一行相同,否则分组序号加一。最后我们使用 `max()` 窗口函数来获取每一组唯一一个不为 $null$ 的值。
76+
6977
<!-- tabs:start -->
7078

7179
### **SQL**
7280

7381
<!-- 这里可写当前语言的特殊实现逻辑 -->
7482

7583
```sql
84+
# Write your MySQL query statement below
85+
SELECT
86+
id,
87+
CASE
88+
WHEN drink IS NOT NULL THEN @cur := drink
89+
ELSE @cur
90+
END AS drink
91+
FROM CoffeeShop;
92+
```
7693

94+
```sql
95+
# Write your MySQL query statement below
96+
WITH
97+
S AS (
98+
SELECT *, row_number() OVER () AS rk
99+
FROM CoffeeShop
100+
),
101+
T AS (
102+
SELECT
103+
*,
104+
sum(
105+
CASE
106+
WHEN drink IS NULL THEN 0
107+
ELSE 1
108+
END
109+
) OVER (ORDER BY rk) AS gid
110+
FROM S
111+
)
112+
SELECT
113+
id,
114+
max(drink) OVER (
115+
PARTITION BY gid
116+
ORDER BY rk
117+
) AS drink
118+
FROM T;
77119
```
78120

79121
<!-- tabs:end -->

solution/2300-2399/2388.Change Null Values in a Table to the Previous Value/README_EN.md

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,41 @@ Note that the rows in the output are the same as in the input.
6666
### **SQL**
6767

6868
```sql
69+
# Write your MySQL query statement below
70+
SELECT
71+
id,
72+
CASE
73+
WHEN drink IS NOT NULL THEN @cur := drink
74+
ELSE @cur
75+
END AS drink
76+
FROM CoffeeShop;
77+
```
6978

79+
```sql
80+
# Write your MySQL query statement below
81+
WITH
82+
S AS (
83+
SELECT *, row_number() OVER () AS rk
84+
FROM CoffeeShop
85+
),
86+
T AS (
87+
SELECT
88+
*,
89+
sum(
90+
CASE
91+
WHEN drink IS NULL THEN 0
92+
ELSE 1
93+
END
94+
) OVER (ORDER BY rk) AS gid
95+
FROM S
96+
)
97+
SELECT
98+
id,
99+
max(drink) OVER (
100+
PARTITION BY gid
101+
ORDER BY rk
102+
) AS drink
103+
FROM T;
70104
```
71105

72106
<!-- tabs:end -->
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
# Write your MySQL query statement below
2+
WITH
3+
S AS (
4+
SELECT *, row_number() OVER () AS rk
5+
FROM CoffeeShop
6+
),
7+
T AS (
8+
SELECT
9+
*,
10+
sum(
11+
CASE
12+
WHEN drink IS NULL THEN 0
13+
ELSE 1
14+
END
15+
) OVER (ORDER BY rk) AS gid
16+
FROM S
17+
)
18+
SELECT
19+
id,
20+
max(drink) OVER (
21+
PARTITION BY gid
22+
ORDER BY rk
23+
) AS drink
24+
FROM T;

0 commit comments

Comments
 (0)