LeetCode刷题-数据库(MySQL)-534. Game Play Analysis III

534. Game Play Analysis III

一、题目描述

Table: Activity

Column Name Type
player_id int
device_id int
event_date date
games_played int

(player_id, event_date) is the primary key of this table.
This table shows the activity of players of some game.
Each row is a record of a player who logged in and played a number of games (possibly 0) before logging out on some day using some device.

Write an SQL query that reports for each player and date, how many games played so far by the player. That is, the total number of games played by the player until that date. Check the example for clarity.

The query result format is in the following example:

Activity table:

player_id device_id event_date games_played
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

Result table:

player_id event_date games_played_so_far
1 2016-03-01 5
1 2016-05-02 11
1 2017-06-25 12
3 2016-03-02 0
3 2018-07-03 5

For the player with id 1, 5 + 6 = 11 games played by 2016-05-02, and 5 + 6 + 1 = 12 games played by 2017-06-25.
For the player with id 3, 0 + 5 = 5 games played by 2018-07-03.
Note that for each player we only care about the days when the player logged in.

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

二、思路分析

Write an SQL query that reports for each player and date, how many games played so far by the player. That is, the total number of games played by the player until that date.
本题要求报告每名选手在某个日期前所进行的所有比赛场数。也就是说,我们需要先比较日期的大小,比当前日期小的,场数加进来,把当前日期大的,排除掉。

一般来说,涉及到比较大小的问题时,需要进行表的连接,以左表为基准,右表中日期小于等于左表日期的,就把场数加进来。进行表连接(本题中为自连)时,我们希望保留一个表(假设为左表)的全部内容,另一个表(右表)中日期大于左表日期的都无需保留,所以使用表的左连接。

另外,在分组时,因为最后需要呈现的结果是每个选手在每个日期上的场数,所以分组时也是将选手id和日期捆绑同时作为分组依据。

三、代码实现

SELECT
	a.player_id, 
	a.event_date, 
	SUM(b.games_played) AS games_played_so_far
FROM
	Activity a
LEFT JOIN
	Activity b
ON
	a.player_Id = b.player_Id
	AND a.event_date >= b.event_date
GROUP BY a.player_Id, a.event_date
ORDER BY a.player_Id, a.event_date ASC;

你可能感兴趣的:(MySQL)