前述
窗口函数相关知识推荐阅读:通俗易懂的学会:SQL窗口函数
题目描述
leetcode 题目:511. 游戏玩法分析 I
思路
方法一: min, group by:分组,排序
- 不用别名:1242 ms 击败5.08%使用 MySQL 的用户
select player_id, MIN(event_date) as first_login
from Activity
group by player_id;
- 用别名:473ms击败56.30%使用 MySQL 的用户
select A.player_id, MIN(A.event_date) as first_login
from Activity A
group by A.player_id;
经过验证:当增加新的列名时,使用别名效率更高。
方法二:窗口函数
--错误示例:报错:Unknown column 'rk' in 'where clause' ,解决:得设个临时表
-- select player_id,event_date,
-- row_number() over (partition by player_id order by event_date) as rk
-- from Activity
-- where rk = 1; --正确示范:
select B.player_id, B.event_date as first_login
from (select A.player_id,A.event_date,row_number() over (partition by A.player_id order by A.event_date) as rkfrom Activity A
) B
where B.rk = 1;
方法三: FIRST_VALUE()
-- note: 加上别名A.就不超出时间限制了。可提高效率
select distinct A.player_id,first_value(A.event_date) over(partition by A.player_id order by A.event_date) as first_login
from Activity A;