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 服务器)
#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
.
还建议在 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 服务器)