網(wǎng)站開發(fā)屬于什么大學(xué)專業(yè)百度seo優(yōu)化技巧
力扣題
1、題目地址
2388. 將表中的空值更改為前一個(gè)值
2、模擬表
表:CoffeeShop
Column Name | Type |
---|---|
id | int |
drink | varchar |
- id 是該表的主鍵(具有唯一值的列)。
- 該表中的每一行都顯示了訂單 id 和所點(diǎn)飲料的名稱。一些飲料行為 null。
3、要求
編寫一個(gè)解決方案將 drink 的 null 值替換為前面最近一行不為 null 的 drink。保證表第一行的 drink 不為 null。
返回 與輸入順序相同的 結(jié)果表。
查詢結(jié)果格式示例如下。
示例 1:
輸入:
CoffeeShop 表:
id | drink |
---|---|
9 | Rum and Coke |
6 | null |
7 | null |
3 | St Germain Spritz |
1 | Orange Margarita |
2 | null |
輸出:
id | drink |
---|---|
9 | Rum and Coke |
6 | Rum and Coke |
7 | Rum and Coke |
3 | St Germain Spritz |
1 | Orange Margarita |
2 | Orange Margarita |
解釋:
對(duì)于 ID 6,之前不為空的值來自 ID 9。我們將 null 替換為 “Rum and Coke”。
對(duì)于 ID 7,之前不為空的值來自 ID 9。我們將 null 替換為 “Rum and Coke”。
對(duì)于 ID 2,之前不為空的值來自 ID 1。我們將 null 替換為 “Orange Margarita”。
請(qǐng)注意,輸出中的行與輸入中的行相同。
4、代碼編寫
我的寫法
思路:首先要求里面的輸出順序還是和原先一樣,原先并沒有按什么排序,所以我們得先對(duì)數(shù)據(jù)標(biāo)上序號(hào),這就可以用到窗口函數(shù) row_numer,然后我們只需要在查詢到 null 數(shù)據(jù)的時(shí)候,去查詢比這個(gè) null 數(shù)據(jù)的序號(hào)小的不為 null 的數(shù)據(jù),然后根據(jù)序號(hào)倒序,取第一條即可,就能滿足要求
里面需要注意的一點(diǎn)就是窗口函數(shù) ROW_NUMBER() over()
,over
括號(hào)里面是不加分組和排序的
WITH tmp AS (SELECT *, ROW_NUMBER() over() AS rnFROM CoffeeShop
)
SELECT id, IFNULL(drink, (SELECT drink FROM tmp WHERE rn < one.rn AND drink IS NOT NULL ORDER BY rn DESC LIMIT 1)) AS drink
FROM tmp AS one
知識(shí)點(diǎn)
臨時(shí)變量有兩種用法:(temp 可以改成其他名)
1、使用 set,定義形式 set @temp=[var]
SET @temp=10;
SELECT @temp;
2、使用 select,定義形式 select @temp:=[var],下面兩種都可以輸出
SELECT @temp:=10;
SELECT @temp:=10;
SELECT @temp;
參考:mysql 臨時(shí)變量
網(wǎng)友寫法(臨時(shí)變量用法)
SELECT id,@temp := IFNULL(drink, @temp) drink
FROM CoffeeShop
上面網(wǎng)友寫法就是用的第二種用法,代碼分析如下:
第 1 行:IFNULL
不為 null
,將 Rum and Coke
賦值到 @temp
里面,并輸出 SELECT @temp:= drink
(drink='Rum and Coke'
)
第 2 行:IFNULL
為 null
,將 @temp
賦值到 @temp
里面,并輸出 SELECT @temp:=@temp
(@temp='Rum and Coke'
)
第 3 行:IFNULL
為 null
,將 @temp
賦值到 @temp
里面,并輸出 SELECT @temp:=@temp
(@temp='Rum and Coke'
)
第 4 行:IFNULL
不為 null
,將 St Germain Spritz
賦值到 @temp
里面,并輸出 SELECT @temp:= drink
(drink='St Germain Spritz'
)
第 5 行:IFNULL
不為 null
,將 Orange Margarita
賦值到 @temp
里面,并輸出 SELECT @temp:= drink
(drink='Orange Margarita'
)
第 6 行:IFNULL
為 null
,將 @temp
賦值到 @temp
里面,并輸出 SELECT @temp:=@temp
(@temp='Orange Margarita'
)
id | drink |
---|---|
9 | Rum and Coke -> @temp |
6 | null <- @temp |
7 | null <- @temp |
3 | St Germain Spritz -> @temp |
1 | Orange Margarita -> @temp |
2 | null <- @temp |