För n=2 kan du
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)
för alla n kan du använda metoder som beskrivs här för att simulera rang över partition.
EDIT:Faktiskt det här artikeln ger dig exakt vad du behöver.
I grund och botten är det ungefär så här
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
Ersätt grouper
med namnet på kolumnen du vill gruppera efter och val
med namnet på kolumnen som innehåller värdena.
För att ta reda på exakt hur det fungerar, gå steg-för-steg från den mest inre frågan och kör dem.
Det finns också en liten förenkling - underfrågan som hittar mid
kan returnera NULL om en viss kategori inte har tillräckligt med värden så det borde finnas COALESCE av det till någon konstant som skulle vara vettigt i jämförelsen (i ditt fall skulle det vara MIN för domänen för valet, i artikeln är det MAX).
EDIT2: Jag glömde att nämna att det är LIMIT 2,1 som bestämmer n (LIMIT n,1).