For n=2 kunne 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)
for enhver n kan du bruge fremgangsmåder beskrevet her for at simulere rang over partition.
EDIT:Faktisk dette artiklen vil give dig præcis, hvad du har brug for.
Grundlæggende er det sådan noget her
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
Erstat grouper
med navnet på den kolonne, du vil gruppere efter, og val
med navnet på den kolonne, der indeholder værdierne.
For at finde ud af, hvordan det præcist fungerer, gå trin-for-trin fra den mest indre forespørgsel og kør dem.
Der er også en lille forenkling - underforespørgslen, der finder mid
kan returnere NULL, hvis en bestemt kategori ikke har nok værdier, så der burde være COALESCE af det til en konstant, der ville give mening i sammenligningen (i dit tilfælde ville det være MIN af domænet for val, i artiklen er det MAX).
EDIT2: Jeg glemte at nævne, at det er LIMIT 2,1, der bestemmer n (LIMIT n,1).