MySQL Max Average按2个字段分组

时间:2016-07-14 19:22:41

标签: mysql sql

我正在尝试执行以下操作。我有这张表x

 id  | rssi | Loc 

 160 | -83  |51      
 160 | -61  |51     
 161 | -80  |51  
 163 | -81  |51  
 161 | -88  |52  
 161 | -82  |53

我希望得到Loc中每个{id}的最大平均值。换句话说,我希望按Locid分组,然后从中获取每个Loc的最大id及其Loc。 结果将是这样的:

id  | maxAvg | Loc 

160 | -72    | 51    
163 | -81    | 52  
161 | -82    | 53  

到目前为止我已经尝试过了:

SELECT loc, id, avg(rssi) as w FROM x
group by loc, id

第一部分是对每个loc和id进行rssi分组的平均值,但后来这里我有点迷失了:

  

选择Loc,id,Max(t.w)
  FROM(SELECT t.Loc,t.id,avg(rssi)as w
  来自x group by   Loc,id)t
  t.Loc组   顺序由t.Loc asc;

我不知道这是不是正确的做法。任何帮助都非常受欢迎。 感谢。

解决:

SELECT t.loc, t.id, t.w 
FROM (SELECT loc, id, avg(rssi) as w
FROM p
group by loc, id order by loc, w desc)
group by t.loc;

1 个答案:

答案 0 :(得分:1)

这很棘手!!让我们一起来看看。你可以跟随in this example

你正朝着你需要的方向前进。困难的部分是引入与您已计算的平均值相匹配的id

所以我做的第一件事就是订购结果,以便最低的平均值显示为每组的第一行:

SELECT loc, id, avg(rssi) as w
FROM p
group by loc, id order by loc, w desc;

从那里我做了一个快速计数器来对每一行进行排名,并且仅提取rank = 1

SET @loc = NULL, @currvalue = NULL;

select  id, w,
    @currcount := IF(@loc = loc, @currcount + 1, 1) AS rank,
    @loc := loc AS loc from 
(SELECT loc, id, avg(rssi) as w
FROM p
group by loc, id order by loc, w desc) r
having rank = 1
;

这可以为您提供所需的结果