Dette er det største-n-per-gruppe-problem, der ofte dukker op på Stack Overflow.
Her er mit sædvanlige svar:
select
p.name player,
s.date first_score,
s.points points
from players p
join scores s
on s.player_id = p.id
left outer join scores s2
on s2.player_id = p.id
and s2.date < s.date
where
s2.player_id is null
;
Med andre ord, givet score s, prøv at finde en score s2 for den samme spiller, men med en tidligere dato. Hvis der ikke findes nogen tidligere score, så er s den tidligste.
Vedrørende din kommentar om slips:Du skal have en politik for, hvilken du skal bruge i tilfælde af uafgjort. En mulighed er, hvis du bruger auto-inkrementering primære nøgler, den med den mindste værdi er den tidligere. Se den ekstra term i den ydre sammenføjning nedenfor:
select
p.name player,
s.date first_score,
s.points points
from players p
join scores s
on s.player_id = p.id
left outer join scores s2
on s2.player_id = p.id
and (s2.date < s.date or s2.date = s.date and s2.id < s.id)
where
s2.player_id is null
;
Grundlæggende skal du tilføje tiebreaker-vilkår, indtil du kommer ned til en kolonne, der garanteret er unik, i det mindste for den givne spiller. Tabellens primære nøgle er ofte den bedste løsning, men jeg har set tilfælde, hvor en anden kolonne var egnet.
Med hensyn til de kommentarer, jeg delte med @OMG Ponies, så husk, at denne type forespørgsel har stor gavn af det rigtige indeks.