2011-05-19 111 views
13

如何從表中選擇前n個最大值?mysql select top n最大值

對於像這樣的表:

column1 column2 
    1  foo 
    2  foo 
    3  foo 
    4  foo 
    5  bar 
    6  bar 
    7  bar 
    8  bar 

對於n = 2,則結果需要是:

3  
4  
7  
8  

該方法下面對每個組只選擇最大值。

SELECT max(column1) FROM table GROUP BY column2 

返回:

4 
8 
+0

你需要一個解決方案n = 2或任意n的一般解決方案? – Unreason 2011-05-19 09:32:40

+0

@Unreason:任意n – 2011-05-19 11:55:54

+0

我實際更新瞭解決方案 - 如果您想要進一步解釋它是如何工作的(並且您無法從文章中找到解決方法)請告訴我。 – Unreason 2011-05-19 12:29:39

回答

4

對於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。

+0

這個答案拯救生命。 – 2017-08-29 20:30:54

1

如果您使用mySQl,爲什麼不使用LIMIT功能? 排序按降序排列,並限制與前n即記錄:

SELECT yourColumnName FROM yourTableName 
ORDER BY Id desc 
LIMIT 0,3 
+0

好點,這帶來了問題。如果我只想以最大值檢索,那麼可以有多個呢?我嘗試過像max(x)這樣的選項,其中max(x)=(選擇--top values--),但不知道如何使它工作。 – MJoraid 2012-11-30 07:24:33

0

這是我應得每組的N個最大行數在MySQL

SELECT co.id, co.person, co.country 
FROM person co 
WHERE (
SELECT COUNT(*) 
FROM person ci 
WHERE co.country = ci.country AND co.id < ci.id 
) < 1 
; 

它是如何工作的:

  • 自己加入表
  • 組通過co.country = ci.country
  • 每組個N個元素被 ) < 1所以對於3個元素受控 - )
  • 獲得最大或最小取決於:co.id < ci.id
    • CO。ID < ci.id - 最大
    • co.id> ci.id - 分鐘

完整的示例在這裏:

mysql select n max values per group/

mysql select max and return multiple values

注:在有應該在兩個地方完成像性別= 0這樣的額外限制。所以如果你只想要男性,那麼你應該對內部和外部選擇應用約束