前言
練習sql語句,所有題目來自于力扣(https://leetcode.cn/problemset/database/)的免費數據庫練習題。
今日題目:
550.游戲玩法分析IV
表:Activity
列名 | 類型 |
---|---|
player_id | int |
device_id | int |
event_date | date |
games_played | int |
(player_id,event_date)是此表的主鍵(具有唯一值的列的組合)。這張表顯示了某些游戲的玩家的活動情況。每一行是一個玩家的記錄,他在某一天使用某個設備注銷之前登錄并玩了很多游戲(可能是 0)。
編寫解決方案,報告在首次登錄的第二天再次登錄的玩家的 比率,四舍五入到小數點后兩位。換句話說,你需要計算從首次登錄日期開始至少連續兩天登錄的玩家的數量,然后除以玩家總數。
我那不值一提的想法:
- 首先梳理表內容,題干一共給了一張活躍表,記錄了玩家id,設備id,活動情況,玩游戲的數量
- 其次分析需求,我們需要找到首次登錄的第二天再次登錄的玩家的比率
- 首先是首次登錄的日期,由于我們需要的是首次登錄的日期,所以不能隨便兩天日期連起來都行,所以我們首先需要計算出每個用戶登錄的首次日期,通過min()+groupby()得到結果
select player_id,min(event_date) as mindate
from Activity
group by player_id
- 其次是需要得到首次登錄后連續兩天登錄的玩家,這里我們就把首次登錄日期作為一個臨時表a與原表相連接,同時篩選條件
where datediff(a2.event_date,a.mindate) = 1
,就能得首次登錄后連續兩天登錄的玩家
select a2.player_id
from Activity a2
left join
( select player_id,min(event_date) as mindatefrom Activitygroup by player_id
) as a
on a2.player_id = a.player_id
where datediff(a2.event_date,a.mindate) = 1
- 然后我們需要求fraction,也就是連續登錄玩家占總玩家的比例,連續登錄玩家我們已經得到了,直接加個count計算數量,總玩家我們可以再嵌套一個子查詢,
select count(distinct player_id) from Activity
得到所有玩家數量。然后最后加上round(,2)
,就得到了最終的結果
select round(count(a2.player_id)/(select count(distinct player_id) from Activity),2) as fraction
from Activity a2
left join
( select player_id,min(event_date) as mindatefrom Activitygroup by player_id
) as a
on a2.player_id = a.player_id
where datediff(a2.event_date,a.mindate) = 1
結果:
總結:
能運行就行。