1. 程式人生 > 其它 >leetcode上sql題刷題記錄(2022-04-01)

leetcode上sql題刷題記錄(2022-04-01)

511 遊戲玩法分析 I

程式碼如下:

# 自己的錯誤程式碼
select player_id,event_date as first_login
from Activity group by player_id,event_date  having min(event_date);
# 自己改進的程式碼
select player_id, min(event_date) as first_login
from Activity where player_id  in (select distinct player_id
from Activity) group by player_id;
# 網上的程式碼
select player_id,min(event_date) first_login
from Activity
group by player_id;

解題思路:

先是找出題目的關鍵字 .....每位玩家.....第一次.....日期 每位玩家說明要根據玩家id分組,要用到group by 第一次,說明要獲取分組後的資料日期最小的值

548-尋找使用者推薦人

程式碼如下:

#  自己開始想到的解法
select name  from customer
where referee_id !=2;

#  自己優化的解法 (網上說null不能直接用算術運算子進行比較)
select name  from customer
where referee_id is null or  referee_id !=2;

#  網上的解決方案 (null不能參與運算,但是''可以)
select name  from customer
where ifnull(referee_id,'')!=2;

# 下面的語句同樣錯誤 null不能直接用算術運算子進行比較 比較null用 is null 或者 IS NOT NULL
SELECT name FROM customer WHERE referee_id = NULL OR referee_id <> 2;

解題思路: 先抓關鍵字 不是 2 說明只需要判斷推薦人id不等於2就行了, 但是這個題有隱藏的知識點 那就是 is null 和 is not null

586-訂單最多的客戶

程式碼如下:

# 開始的想法,但是提示我不能巢狀聚合函式
select count(order_number) as num ,customer_number from
Orders group by customer_number having max(num);

# 因為要用max()取最大值,於是想到了倒序後取第一個值,修改的d程式碼如下
select customer_number
from (select count(order_number) as num ,customer_number from
Orders group by customer_number order by num desc limit 1) as c;

解題思路 : 先抓關鍵字 ...最多訂單 .... 說明要分組, 還要用到count 函式 分組是為了知道每位客戶的下單情況 count是為了得到下單最多的使用者 題目的意思是隻要一個使用者,說明還有用limit 取一個使用者出來即為 limt 1