astak16 / blog-mysql

LeetCode 数据库刷题

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

13 游戏玩法分析 I

astak16 opened this issue · comments

题目

获取每位玩家第一次登录平台的日期

create table activity (
	player_id int,
	device_id int,
	event_date date,
	games_played int
);

insert into activity values
(1, 2, '2016-03-01', 5),
(1, 2, '2016-05-02', 6),
(1, 3, '2017-06-25', 1),
(3, 1, '2016-03-02', 0),
(3, 4, '2018-07-03', 5);

SQL:方法一

select player_id, min(event_date) as first_login from activity
group by player_id;

解析

  • 按照 player_idactivity 分组
  • 使用 min 函数,求出日期的最小值

SQL:方法二

select player_id, event_date as first_login from (
	select
		player_id,
		event_date,
		dense_rank()
		 over(partition by player_id order by event_date) as 排名
	from activity
) as temp where 排名 = 1;

解析

  • 使用 dense_rank 函数按照 player_idevent_date 进行排序,并算出排名将其作为临时表 temp
  • 查询临时表 temp,筛选出 排名 = 1 数据