Para n=2 você poderia
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)
para qualquer n, você pode usar as abordagens descritas aqui para simular a classificação sobre a partição.
EDIT:Na verdade isto artigo lhe dará exatamente o que você precisa.
Basicamente é algo assim
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
Substituir
grouper
com o nome da coluna pela qual você deseja agrupar e val
com o nome da coluna que contém os valores. Para descobrir como exatamente funciona, vá passo a passo da consulta mais interna e execute-a.
Além disso, há uma pequena simplificação - a subconsulta que encontra o
mid
pode retornar NULL se determinada categoria não tiver valores suficientes então deve haver COALESCE disso para alguma constante que faria sentido na comparação (no seu caso seria MIN de domínio do val, no artigo é MAX). EDIT2: Esqueci de mencionar que é o LIMIT 2,1 que determina o n (LIMIT n,1).