Per n=2 potresti
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)
per ogni n è possibile utilizzare gli approcci descritti qui per simulare il rango su partizione.
EDIT:In realtà questo l'articolo ti darà esattamente ciò di cui hai bisogno.
Fondamentalmente è qualcosa del genere
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
Sostituisci grouper
con il nome della colonna per cui vuoi raggruppare e val
con il nome della colonna che contiene i valori.
Per capire come funziona esattamente, vai passo dopo passo dalla query più interna ed eseguile.
Inoltre, c'è una leggera semplificazione:la sottoquery che trova il mid
può restituire NULL se una determinata categoria non ha valori sufficienti, quindi dovrebbe esserci COALESCE di quello su una costante che avrebbe senso nel confronto (nel tuo caso sarebbe MIN del dominio di val, nell'articolo è MAX).
EDIT2: Dimenticavo di dire che è il LIMITE 2,1 che determina la n (LIMITE n,1).