O desafio consiste em uma tabela que registra os jogos dos usuários em seus dispositivos. A tabela Activity tem player_id, device_id, event_date e games_played. Cada linha mostra que um jogador fez login em um device e jogou alguns jogos naquele dia.

O objetivo é retornar o device que o jogador usou no seu primeiro login.


Exemplo

Input:

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

Output esperado:

player_id device_id
1 2
2 3
3 1

Minha primeira ideia — usar DISTINCT ON do PostgreSQL

SELECT DISTINCT ON (player_id) player_id, device_id
FROM Activity
ORDER BY player_id, event_date;

Quando vi o desafio, pensei: “isso parece simples, só preciso de DISTINCT ON para pegar uma linha por jogador e ordenar pelo event_date”.


Segunda ideia — usar JOIN com MIN(event_date)

O problema é que DISTINCT ON só funciona no PostgreSQL, então quis encontrar uma forma que funcionasse em qualquer SQL.

SELECT
    a1.player_id,
    a1.device_id
FROM
    Activity a1
INNER JOIN (
    SELECT
        player_id,
        MIN(event_date) AS first_date
    FROM
        Activity
    GROUP BY
        player_id
) a2
ON
    a1.player_id = a2.player_id
    AND a1.event_date = a2.first_date;

Aqui foi o meu raciocínio passo a passo:

  1. Primeiro, pensei: “quero a primeira data de cada jogador”.