MySQL查找最大值为

时间:2017-09-25 20:43:40

标签: mysql subquery greatest-n-per-group

我有一个复杂的SELECT查询,它返回如下信息:

+------+-------+--------+
| a    | b     | c      |
+------+-------+--------+
| 2482 |  3681 |  58248 |
| 2482 | 17727 | 139249 |
| 2482 | 23349 | 170839 |
| 3031 | 14877 | 122921 |
| 3031 | 20691 | 156457 |
| 3031 | 20932 | 157784 |
+------+-------+--------+

我正试图找出如何为每个a值返回最大值为b的行。 here中的解决方案看起来很有前途,但我无法使其工作,因为我的起点不是表而是查询(或视图,我猜),我收到错误

  

“ERROR 1146(42S02):表'databasename.s'不存在”

当我尝试以上述问题的方式引用子查询时:

select s.* from (SELECT blah blah complex) s where s.b = (select max(s2.b) from s s2 where s2.a = s.a);

我很确定这是一个半繁琐的问题,但我已经把它搁浅了好几个小时,根本不理解它足以导航我的方式......

编辑:我应该澄清我想要输出的内容:

    +------+-------+--------+
    | a    | b     | c      |
    +------+-------+--------+
    | 2482 | 23349 | 170839 |
    | 3031 | 20932 | 157784 |
    +------+-------+--------+

MySQL版本是5.5.49(Ver 14.14 Distrib 5.5.49)

更新:@Harshil的回答澄清了我的尝试基本上是不可能的,所以我最终遵循其他问题的指导(由@Bill Karwin的提交指导)并重写我的原始查询以执行另一个JOIN(针对子查询)这是max()。

3 个答案:

答案 0 :(得分:0)

 select a,b,c from examp where (a,b) in (select a ,max(b) from examp group by a );

答案 1 :(得分:0)

别名s在子查询中无法显示。所以你必须在子查询中再次编写它。也可以使用group by代替where子句,如下所示:

select s.* 
  from 
     (SELECT blah blah complex) s 
        where (s.a,s.b) in (select s2.a,max(s2.b) from (SELECT blah blah complex) group by s2.a);

或者,创建查询(SELECT blah blah complex)查看,即名为 V 并在主查询中使用它,如下所示:

select * 
  from V
     where (a,b) in (select v2.a,max(v2.b) from V as v2 group by v2.a);

希望它有所帮助!

答案 2 :(得分:-1)

首先,使用

SELECT * INTO newTableName 

FROM yourRules 

将查询保存到新表。

然后我们可以从新表中做另一个选择。

SELECT *
FROM newTableName t1
WHERE b = (
     SELECT max(b) 
     FROM newTableName t2
     WHERE t1.a = t2.a
)