對於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描述here在分區模擬等級。
編輯: 其實this文章會給你你需要什麼。
基本上它是這樣的
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
與列的名稱要GROUP BY和val
與保存值的列名。
要弄清楚它的功能如何從最內在的查詢中逐步執行並運行它們。
此外,還有一個小的簡化 - 發現mid
的子查詢可以返回NULL,如果某個類別沒有足夠的值,所以應該有COALESCE的某些常數,在比較中會有意義(在你的情況下它是val的域,文中它是MAX)。
EDIT2: 我忘了提及它是確定n(LIMIT n,1)的LIMIT 2.1。
你需要一個解決方案n = 2或任意n的一般解決方案? – Unreason 2011-05-19 09:32:40
@Unreason:任意n – 2011-05-19 11:55:54
我實際更新瞭解決方案 - 如果您想要進一步解釋它是如何工作的(並且您無法從文章中找到解決方法)請告訴我。 – Unreason 2011-05-19 12:29:39