Ответ 1
При 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 должен иметь такую константу, которая имела бы смысл при сравнении (в вашем case это будет MIN домена val, в статье это MAX).
EDIT2: Я забыл упомянуть, что именно LIMIT 2,1 определяет n (LIMIT n, 1).