返回介绍

solution / 0500-0599 / 0512.Game Play Analysis II / README

发布于 2024-06-17 01:04:00 字数 2283 浏览 0 评论 0 收藏 0

512. 游戏玩法分析 II

English Version

题目描述

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

解法

方法一:子查询

我们可以使用 GROUP BYMIN 函数来找到每个玩家的第一次登录日期,然后使用联合键子查询来找到每个玩家的第一次登录设备。

# Write your MySQL query statement below
SELECT
  player_id,
  device_id
FROM Activity
WHERE
  (player_id, event_date) IN (
    SELECT
      player_id,
      MIN(event_date) AS event_date
    FROM Activity
    GROUP BY 1
  );

方法二:窗口函数

我们可以使用窗口函数 rank(),它可以为每个玩家的每个登录日期分配一个排名,然后我们可以选择排名为 $1$ 的行。

# Write your MySQL query statement below
WITH
  T AS (
    SELECT
      *,
      RANK() OVER (
        PARTITION BY player_id
        ORDER BY event_date
      ) AS rk
    FROM Activity
  )
SELECT player_id, device_id
FROM T
WHERE rk = 1;

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文