- 学习:知识的初次邂逅
- 复习:知识的温故知新
- 练习:知识的实践应用
一,原题力扣链接
二,题干
Table:
Activity
+--------------+---------+ | Column Name | Type | +--------------+---------+ | player_id | int | | device_id | int | | event_date | date | | games_played | int | +--------------+---------+ (player_id, event_date) 是这个表的两个主键(具有唯一值的列的组合) 这个表显示的是某些游戏玩家的游戏活动情况 每一行是在某天使用某个设备登出之前登录并玩多个游戏(可能为0)的玩家的记录请编写解决方案,描述每一个玩家首次登陆的设备名称
返回结果格式如以下示例:
示例 1:
输入: Activity table: +-----------+-----------+------------+--------------+ | 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 | +-----------+-----------+------------+--------------+ 输出: +-----------+-----------+ | player_id | device_id | +-----------+-----------+ | 1 | 2 | | 2 | 3 | | 3 | 1 | +-----------+-----------+
三,建表语句
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
第一步开窗 以设备id分组,以时间排序 row_nunber开窗排序
select player_id, device_id, event_date, games_played,
row_number() over (partition by player_id order by event_date) rn
from activity
第二步, 求rn=1 取游戏id和设备id即可
五,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,device_id from t1 where rn =1;
六,验证
七,知识点总结
- 经典案例 分组求top1
- 开窗函数 取第一
- 过滤即可
- 学习:知识的初次邂逅
- 复习:知识的温故知新
- 练习:知识的实践应用