Para n=2 podrías
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 cualquier n podría usar los enfoques descritos aquí para simular el rango sobre la partición.
EDITAR:En realidad esto artículo le dará exactamente lo que necesita.
Básicamente es algo como esto
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
Reemplazar grouper
con el nombre de la columna por la que desea agrupar y val
con el nombre de la columna que contiene los valores.
Para averiguar cómo funciona exactamente, vaya paso a paso desde la consulta más interna y ejecútela.
Además, hay una ligera simplificación:la subconsulta que encuentra el mid
puede devolver NULL si cierta categoría no tiene suficientes valores, por lo que debe COALESCE de eso a alguna constante que tenga sentido en la comparación (en su caso, sería MIN del dominio del valor, en el artículo es MAX).
EDIT2: Olvidé mencionar que es el LÍMITE 2,1 el que determina el n (LÍMITE n,1).