[LeetCode] 534. Game Play Analysis III

2022. 11. 27. 22:16TIL💡/Database

난이도 상승하는 게 느껴진다.

이는 player_id별로 누적합을 구하려 하니, subquery로 2중 루프 같이 각 누적합을 구하려 하니 TLE(Time Limit Exceeded)하게 되었다.

SELECT A1.player_id, A1.event_date,
    (
    SELECT
        SUM(A2.games_played)
    FROM
        Activity A2
    WHERE
        A2.player_id = A1.player_id
        AND A2.event_date <= A1.event_date
    ) AS games_played_so_far
FROM
Activity A1;

Approach 1: SUM() window function

SUM 함수에도 OVER, PARTITION BY가 존재하는지 몰랐다;; RANK에만 있는 줄 알았는데

SUM(대상) OVER(PARTITION BY 분류 기준 ORDER BY 정렬 기준)

SELECT
    player_id,
    event_date, 
    SUM(games_played) OVER(
        PARTITION BY player_id
        ORDER BY event_date
    ) AS games_played_so_far
FROM Activity

이렇게 만들면 player_id별로 누적합을 구할 수 있다. 

Approach 2: Non-equi self join

1. Activity 테이블을 player_id가 동일하고 event_date가 다른 event_date에 비해 같거나 작은 경우에 셀프 조인한다. 

2. aggregate function을 적용하기 위해 player_id와 event_date를 기준으로 그룹으로 묶는다.

3. SUM() aggregate function을 games_played 필드에 적용한다.

SELECT
  A2.player_id,
  A2.event_date,
  SUM(A1.games_played) AS games_played_so_far
FROM
  Activity A1
  INNER JOIN Activity A2 ON A1.player_id = A2.player_id
  AND A1.event_date <= A2.event_date
GROUP BY
  A2.player_id,
  A2.event_date;