Ini adalah masalah terbesar-n-per-grup yang sering muncul di Stack Overflow.
Inilah jawaban saya yang biasa:
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
;
Dengan kata lain, diberikan skor s, coba cari skor s2 untuk pemain yang sama, tetapi dengan tanggal yang lebih awal. Jika tidak ada skor lebih awal yang ditemukan, maka s adalah yang paling awal.
Komentar Anda tentang dasi:Anda harus memiliki kebijakan yang mana yang akan digunakan jika dasi. Salah satu kemungkinannya adalah jika Anda menggunakan kunci utama yang bertambah secara otomatis, yang memiliki nilai paling sedikit adalah yang lebih awal. Lihat istilah tambahan di outer join di bawah ini:
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
;
Pada dasarnya Anda perlu menambahkan istilah tiebreaker sampai Anda turun ke kolom yang dijamin unik, setidaknya untuk pemain yang diberikan. Kunci utama tabel sering kali merupakan solusi terbaik, tetapi saya telah melihat kasus di mana kolom lain cocok.
Mengenai komentar yang saya bagikan dengan @OMG Ponies, ingatlah bahwa jenis kueri ini sangat diuntungkan dari indeks yang tepat.