一尘不染

MySQL选择前n个最大值

mysql

如何从表中选择前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

阅读 419

收藏
2020-05-17

共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,您都可以使用此处介绍的方法模拟分区之上的排名。

编辑:其实这个文章会给你你需要什么。

基本上是这样的

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,
val的域,在本文中为MAX)。

EDIT2: 我忘了提到确定n(LIMIT n,1)的是LIMIT 2,1。

2020-05-17