Detta är det största problemet per grupp som dyker upp ofta på Stack Overflow.
Här är mitt vanliga 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 andra ord, givet poäng s, försök att hitta en poäng s2 för samma spelare, men med ett tidigare datum. Om ingen tidigare poäng hittas, är s den tidigaste.
Angående din kommentar om slipsar:Du måste ha en policy för vilken du ska använda vid oavgjort. En möjlighet är om du använder auto-inkrementerande primärnycklar, den med det lägsta värdet är den tidigare. Se tilläggstermen i den yttre sammanfogningen nedan:
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
;
I grund och botten måste du lägga till tiebreaker-termer tills du kommer ner till en kolumn som garanterat är unik, åtminstone för den givna spelaren. Den primära nyckeln i tabellen är ofta den bästa lösningen, men jag har sett fall där en annan kolumn var lämplig.
När det gäller kommentarerna jag delade med @OMG Ponies, kom ihåg att den här typen av frågor har stor nytta av rätt index.