題目描述
Table: Activity
+--------------+---------+
| Column Name | Type |
+--------------+---------+
| player_id | int |
| device_id | int |
| event_date | date |
| games_played | int |
+--------------+---------+
(player_id,event_date)是此表的主鍵。
這張表顯示了某些遊戲的玩家的活動情況。
每一行是一個玩家的記錄,他在某一天使用某個設備註銷之前登錄並玩了很多遊戲(可能是 0)。
編寫一個 SQL 查詢,報告在首次登錄的第二天再次登錄的玩家的分數,四捨五入到小數點後兩位。換句話說,您需要計算從首次登錄日期開始至少連續兩天登錄的玩家的數量,然後除以玩家總數。
查詢結果格式如下所示:
Activity table:
+-----------+-----------+------------+--------------+
| player_id | device_id | event_date | games_played |
+-----------+-----------+------------+--------------+
| 1 | 2 | 2016-03-01 | 5 |
| 1 | 2 | 2016-03-02 | 6 |
| 2 | 3 | 2017-06-25 | 1 |
| 3 | 1 | 2016-03-02 | 0 |
| 3 | 4 | 2018-07-03 | 5 |
+-----------+-----------+------------+--------------+
Result table:
+-----------+
| fraction |
+-----------+
| 0.33 |
+-----------+
只有 ID 爲 1 的玩家在第一天登錄後才重新登錄,所以答案是 1/3 = 0.33
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/game-play-analysis-iv
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
解題思路
框架爲round((再次登錄用戶數)/(所有用戶數),2) as fraction
首次登陸後再次登錄用戶數:先取出首次登陸的用戶和日期,再連接Activity表,篩選出datediff=1的用戶數。
注意:b.min(event_date) 無法使用,min(event_date)需起別名。
代碼
# Write your MySQL query statement below
select round((select count(*) from Activity a join
(select player_id, min(event_date) as first_date from Activity group by player_id) b
on a.player_id=b.player_id
where datediff(a.event_date,b.first_date)=1)/(select count(distinct player_id) from Activity),2) as fraction