#LC 550. 游戲玩法分析 IV
| 列名 | 型別 |
|---|---|
| 玩家 ID | 整數 |
| 設備編號 | 整數 |
| 活動日期 | 日期 |
| 玩過的游戲 | 整數 |
(player_id, event_date) 是這個表的主鍵。該表顯示了某些游戲的玩家活動。每一行都是一個玩家的記錄,該玩家在某天使用某種設備登錄并玩了許多游戲(可能是 0),然后再退出。
請求:撰寫一個 SQL 查詢來報告在他們第一次登錄的第二天再次登錄的玩家比例,四舍五入到小數點后兩位。換句話說,您需要計算從第一次登錄之日起至少連續兩天登錄的玩家數量,然后將該數字除以玩家總數。
| 玩家 ID | 設備編號 | 活動日期 | 玩過的游戲 |
|---|---|---|---|
| 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 |
| 分數 |
|---|
| 0.33 |
下面是我的代碼(SQL Server):
with cte1 as (
select a1.player_id as player_id
from activity a1
right join activity a2
on dateadd(day, 1, a1.event_date) = a2.event_date
)
select round(count(distinct cte1.player_id)/count(distinct activity.player_id), 2) as fraction
from activity, cte1
結果應該是 0.33,但我得到了 0。可能是因為從兩個表中選擇(可以單獨作業)。如果有人可以幫助我理解為什么它是錯誤的,請欣賞它。太感謝了!
uj5u.com熱心網友回復:
乘以它1.0會自動轉換count() (int)為十進制。
select round(count(distinct cte1.player_id) * 1.0/count(distinct activity.player_id) * 1.0, 2) as fraction
from activity, cte1
uj5u.com熱心網友回復:
你實際上離你的嘗試不遠了。
當一個除法的所有運算元都是整數時,您的 DBMS 可能會進行整數除法。向上轉換至少一個運算元,例如乘以1.0。
但另外嘗試左連接,這通常更容易理解和撰寫。您只需要一個加入,而您加入 CTE和外部SELECT.
還建議JOIN在FROM子句中始終使用顯式語法而不是逗號。顯式JOIN語法通常更容易理解和撰寫而不會出錯。
SELECT round(count(DISTINCT a2.player_id) * 1.0
/
count(DISTINCT a1.player_id) * 1.0,
2) AS fraction
FROM activity a1
LEFT JOIN activity a2
ON a1.player_id = a2.player_id
AND a1.event_date = dateadd(day, -1, a2.event_date);
db<>fiddle(假設 SQL Server)
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/389447.html
上一篇:如何檢索每個用戶的最新訂閱?
