Для n = 2 вы могли бы
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)
для любого n вы можете использовать подходы, описанные здесь для имитации ранга над разделом.
EDIT:
На самом деле эта статья даст вам именно то, что вам нужно.
В основном это что-то вроде этого
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
Замените grouper
на имя столбца, по которому вы хотите сгруппировать, и val
на имя столбца, который содержит значения.
Чтобы выяснить, как именно он функционирует, пошагово перейдите к самому внутреннему запросу и выполните их.
Кроме того, есть небольшое упрощение - подзапрос, который находит mid
, может возвратить NULL, если в определенной категории недостаточно значений, поэтому должна быть COALESCE этого значения для некоторой константы, которая имела бы смысл в сравнении (в вашем если это будет MIN домена val, в статье это MAX).
EDIT2:
Я забыл упомянуть, что именно LIMIT 2,1 определяет n (LIMIT n, 1).