512. 游戏玩法分析 II

题目


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

思路


第一眼看题目又是select + 临时表 + group by。

测试


  • 第一次提交
select 
    player_id, device_id
from Activity 
group by player_id 
having min(event_date)

评论发现
having子句执行在select 之后,因此having中的字段必须是在select子句中的,event_date没有再select子句里,所以不行。

测试:

select 
    player_id, device_id, event_date
from Activity 
group by player_id 
having min(event_date)

输入:
{"headers":{"Activity":["player_id","device_id","event_date","games_played"]},"rows":{"Activity":[[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]]}}
输出
{"headers": ["player_id", "device_id", "event_date"], "values": [[1, 2, "2016-03-01"], [2, 3, "2017-06-25"], [3, 1, "2016-03-02"]]}
预期结果
{"headers":["player_id","device_id"],"values":[[1,2],[2,3],[3,1]]}

结果确实这样。

  • 第二次提交

还是看了答案

select 
    player_id, device_id
from activity
where (player_id, event_date) in (
    select player_id, min(event_date) 
    from activity 
    group by player_id
)

总结


having子句执行在select 之后,因此having中的字段必须是在select子句中

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/game-play-analysis-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

你可能感兴趣的:(512. 游戏玩法分析 II)