550. 游戏玩法分析 IV - 为什么我不能从两个表中 select?

550. Game Play Analysis IV - Why I cannot select from two tables?

#LC 550. 游戏玩法分析 IV


Column Name Type
player_id int
device_id int
event_date date
games_played int

(player_id, event_date)是这个table的主键。 这个table显示了部分游戏玩家的activity。 每一行都是一个玩家的记录,该玩家在某天使用某种设备注销之前登录并玩了很多游戏(可能是 0)。

请求:编写一个SQL查询来报告在首次登录后的次日再次登录的玩家比例,四舍五入到小数点后两位。换句话说,你需要计算从第一次登录开始至少连续两天登录的玩家人数,然后除以玩家总数。

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
fraction
0.33

下面是我的代码(SQL服务器):

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。可能是因为 select 来自两个 table(可以单独工作)。如果有人能帮助我理解为什么它是错误的,我将不胜感激。非常感谢!

将它乘以 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

您的尝试实际上并没有太远。

当除法的所有操作数都是整数时,您的 DBMS 可能会执行整数除法。向上转换至少一个操作数,例如乘以 1.0.

但另外尝试左连接,这通常更容易理解和编写。您只需要一个连接,而您在外部 SELECT.

中加入 CTE and

还建议在 FROM 子句中始终使用明确的 JOIN 语法而不是逗号。显式 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 服务器)