Това е най-големият проблем с n-на-група, който се появява често в Stack Overflow.
Ето обичайния ми отговор:
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
;
С други думи, при даден резултат s, опитайте се да намерите резултат s2 за същия играч, но с по-ранна дата. Ако не бъде намерен по-ранен резултат, тогава s е най-ранният.
Относно коментара си за вратовръзки:Трябва да имате политика, за която да използвате в случай на равенство. Една от възможностите е, ако използвате автоматично увеличаващи се първични ключове, този с най-малка стойност е по-ранният. Вижте допълнителния термин във външното присъединяване по-долу:
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
;
По принцип трябва да добавите термини за тайбрек, докато стигнете до колона, която гарантирано е уникална, поне за дадения играч. Първичният ключ на таблицата често е най-доброто решение, но съм виждал случаи, когато друга колона е била подходяща.
По отношение на коментарите, които споделих с @OMG Ponies, не забравяйте, че този тип заявка има огромна полза от правилния индекс.