- 学习:知识的初次邂逅
- 复习:知识的温故知新
- 练习:知识的实践应用
目录
一,原题力扣链接
二,题干
活动表
Activity
:+--------------+---------+ | Column Name | Type | +--------------+---------+ | player_id | int | | device_id | int | | event_date | date | | games_played | int | +--------------+---------+ 在 SQL 中,表的主键是 (player_id, event_date)。 这张表展示了一些游戏玩家在游戏平台上的行为活动。 每行数据记录了一名玩家在退出平台之前,当天使用同一台设备登录平台后打开的游戏的数目(可能是 0 个)。查询每位玩家 第一次登录平台的日期。
查询结果的格式如下所示:
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 | +-----------+-------------+
三,建表语句
Create table If Not Exists Activity (player_id int, device_id int, event_date date, games_played int);
Truncate table Activity;
insert into Activity (player_id, device_id, event_date, games_played) values ('1', '2', '2016-03-01', '5');
insert into Activity (player_id, device_id, event_date, games_played) values ('1', '2', '2016-05-02', '6');
insert into Activity (player_id, device_id, event_date, games_played) values ('2', '3', '2017-06-25', '1');
insert into Activity (player_id, device_id, event_date, games_played) values ('3', '1', '2016-03-02', '0');
insert into Activity (player_id, device_id, event_date, games_played) values ('3', '4', '2018-07-03', '5');
select * from Activity;
四,分析
题解:
表:活动表
字段:玩家id,活动id,游戏时间,游戏次数
要求 玩家第一次登录的时间和id
思路:
解法一:开窗函数
第一步,以玩家id分组,以游戏时间排序
![]()
第二步,条件rn=1
最后更改别名即可
解法二,分组+聚合
以玩家id分组,min(游戏时间) 拿到游戏时间最小的天数
五,SQL解答
解法一,窗口函数
with t1 as (
select player_id, device_id, event_date, games_played,
row_number() over (partition by player_id order by event_date) rn
from Activity
)
select player_id,event_date as first_login from t1 where t1.rn=1;
解法二,常规分组聚合
select player_id,min(event_date) as first_login from Activity group by player_id;
六,验证
七,知识点总结
- 分组求top1,开窗轻松破解;
- 分区求最高或者最小,用常规分组+min或者max也可以
- 开窗函数的练习运用
- 聚合+分组的练习运用
- 学习:知识的初次邂逅
- 复习:知识的温故知新
- 练习:知识的实践应用