当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,您可以使用这里描述的方法来模拟分区内的排名。
编辑:
实际上,这篇文章将为您提供所需的内容。
基本上是这样的:
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,在文章中它是MAX)。
编辑2:我忘了提及它是LIMIT 2,1决定n(LIMIT n,1)。