Mysql 刷题 day05
LC 550 游戏玩法分析
本题思路:
0.首次登陆 想到 min(date)去找最早登陆时间 。在首次登录的情况下第二天再次登录 , 也就是存在最早登陆时间后一天有登陆的行。
1.先把每位玩家首次登陆时间、id查出来 ,作为一张表
2.和主表连表查询 , 再用datediff函数选出 在首次登录的情况下第二天再次登录 的行数 , 除以玩家id即可
select
round(
count(
case when datediff(event_date , first_login) = 1 then 1 end)
/ count(distinct a.player_id)
, 2)
as fraction
from Activity a left join
(select player_id , min(event_date) as first_login
from Activity
group by player_id) as players_first_login
on a.player_id = players_first_login.player_id
LC 1045 买下所有产品的客户
本题坑点
顾客买的产品种类数量并非 count(product key) ,因为可能重复购买同一件商品 ,应该是count(distinct product_key) 利用 distinct结合count进行去重
代码如下
select customer_id
from Customer
group by customer_id
having count(distinct Customer.product_key) = (select count(*) from Product )
LC 1731 每位经理的下属员工数量
思路:
先自联结 ,把每位员工和其对应的经理连接起来 ,后面再加条件选择就可以了
select e2.employee_id , e2.name , count(e1.reports_to) reports_count , round(avg(e1.age) , 0) average_age
from
Employees e1 left join Employees e2
on
e1.reports_to = e2.employee_id
group by e1.reports_to
having e1.reports_to is not null
order by e2.employee_id