LeetCode-512. 游戏玩法分析 II 知识点:right join 和子查询

Table: Activity

+--------------+---------+
| Column Name  | Type    |
+--------------+---------+
| player_id    | int     |
| device_id    | int     |
| event_date   | date    |
| games_played | int     |
+--------------+---------+
(player_id, event_date) 是这个表的两个主键
这个表显示的是某些游戏玩家的游戏活动情况
每一行是在某天使用某个设备登出之前登录并玩多个游戏(可能为0)的玩家的记录
请编写一个 SQL 查询,描述每一个玩家首次登陆的设备名称

查询结果格式在以下示例中:

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            |
+-----------+-----------+------------+--------------+

Result table:
+-----------+-----------+
| player_id | device_id |
+-----------+-----------+
| 1         | 2         |
| 2         | 3         |
| 3         | 1         |
+-----------+-----------+

题目来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/game-play-analysis-ii

审题:描述每一个玩家首次登陆的设备名称.

思考:首次登陆设备名称。日期最小的那次登陆。

解题:

select a.player_id,a.device_id from
Activity a
right join (select player_id,min(event_date) as latest_date from
Activity
group by player_id) b on a.event_date = b.latest_date
where a.player_id = b.player_id

子查询:通过子查询的方式,将查询结果作为条件。 

select a.player_id ,a.device_id from Activity a where (a.player_id ,a.event_date) in 
(select player_id,min(event_date) as first_login from Activity group by player_id)

知识点:

本题 right join    on 相当于  通过右边的查询结果作为左边的条件。

发布了84 篇原创文章 · 获赞 2 · 访问量 2651

猜你喜欢

转载自blog.csdn.net/Hello_JavaScript/article/details/102969169