2011-05-19 106 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这样的额外限制。所以如果你只想要男性,那么你应该对内部和外部选择应用约束