Untuk n=2 Anda bisa
SELECT max(column1) m
FROM table t
GROUP BY column2
UNION
SELECT max(column1) m
FROM table t
WHERE column1 NOT IN (SELECT max(column1)
WHERE column2 = t.column2)
untuk setiap n Anda dapat menggunakan pendekatan yang dijelaskan di sini untuk mensimulasikan peringkat di atas partisi.
EDIT:Sebenarnya ini artikel akan memberikan apa yang Anda butuhkan.
Pada dasarnya seperti ini
SELECT t.*
FROM
(SELECT grouper,
(SELECT val
FROM table li
WHERE li.grouper = dlo.grouper
ORDER BY
li.grouper, li.val DESC
LIMIT 2,1) AS mid
FROM
(
SELECT DISTINCT grouper
FROM table
) dlo
) lo, table t
WHERE t.grouper = lo.grouper
AND t.val > lo.mid
Ganti grouper
dengan nama kolom yang ingin Anda kelompokkan dan val
dengan nama kolom yang menyimpan nilai.
Untuk mengetahui bagaimana tepatnya fungsinya, lakukan langkah demi langkah dari kueri paling dalam dan jalankan.
Juga, ada sedikit penyederhanaan - subquery yang menemukan mid
dapat mengembalikan NULL jika kategori tertentu tidak memiliki nilai yang cukup sehingga harus ada COALESCE dari itu ke beberapa konstanta yang masuk akal dalam perbandingan (dalam kasus Anda itu akan menjadi MIN dari domain val, dalam artikel itu MAX).
EDIT2: Saya lupa menyebutkan bahwa LIMIT 2,1 yang menentukan n (LIMIT n,1).