大家好,我是空空star,本篇带大家了解一道简单的力扣sql练习题。
文章目录
前言
一、题目:511. 游戏玩法分析
活动表 Activity:
+--------------+---------+
| Column Name | Type |
+--------------+---------+
| player_id | int |
| device_id | int |
| event_date | date |
| games_played | int |
+--------------+---------+
表的主键是 (player_id, event_date)。
这张表展示了一些游戏玩家在游戏平台上的行为活动。
每行数据记录了一名玩家在退出平台之前,当天使用同一台设备登录平台后打开的游戏的数目(可能是 0 个)。
写一条 SQL 查询语句获取每位玩家 第一次登陆平台的日期。
查询结果的格式如下所示:
Activity 表:
+-----------+-----------+------------+--------------+
| player_id | device_id | event_date | games_played |
+-----------+-----------+------------+--------------+
| 1 | 2 | 2016-03-01 | 5 |
| 1 | 2 | 2016-05-02 | 6 |
| 2 | 3 | 2017-06-25 | 1 |
| 3 | 1 | 2016-03-02 | 0 |
| 3 | 4 | 2018-07-03 | 5 |
+-----------+-----------+------------+--------------+
Result 表:
+-----------+-------------+
| player_id | first_login |
+-----------+-------------+
| 1 | 2016-03-01 |
| 2 | 2017-06-25 |
| 3 | 2016-03-02 |
+-----------+-------------+
二、解题
1.正确示范①
提交SQL
select player_id,
min(event_date) first_login
from Activity
group by player_id;
运行结果
![](https://img-blog.csdnimg.cn/88cbd4ce1900488bb1e4a1efbb11951f.png)
2.正确示范②
提交SQL
select player_id,event_date first_login
from(
select player_id,event_date,
row_number() over(partition by player_id order by event_date) col
from Activity
) u where col=1;
运行结果
![](https://img-blog.csdnimg.cn/809b0f82dbad46daaf865305567d719d.png)
3.正确示范③
提交SQL
select player_id,event_date first_login
from(
select player_id,event_date,
dense_rank() over(partition by player_id order by event_date) col
from Activity
) u where col=1;
运行结果
![](https://img-blog.csdnimg.cn/b1ef261c035041f98691eac892b60f0f.png)
4.正确示范④
提交SQL
select player_id,event_date first_login
from(
select player_id,event_date,
rank() over(partition by player_id order by event_date) col
from Activity
) u where col=1;
运行结果
![](https://img-blog.csdnimg.cn/1e9accc6bd2c43c49c26e606fbd6bc33.png)
5.其他
总结
正确示范①思路:
通过聚合函数group by player_id,然后对event_date求min即可;
正确示范②思路:
通过row_number() over(partition by player_id order by event_date) 取排名1;
正确示范③思路:
通过dense_rank() over(partition by player_id order by event_date) 取排名1;
正确示范④思路:
通过rank() over(partition by player_id order by event_date) 取排名1;
题目有一个很关键的点,表的主键是 (player_id, event_date),如果没这句话,示范③和示范④就有可能存在多个排名1。