2016-07-14 58 views
0

我正在嘗試以下操作。我有這個表xMySQL最大平均分2字段

id | rssi | Loc 

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

我想獲得由ID爲每個Loc的分組的最大平均。換句話說,我想按照Loc,id,然後從它得到最大Locid爲每個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 

這第一部分是做RSSI每祿和ID分組的平均水平,但後來這裏是我在哪裏我有點迷失:

選擇祿,ID,MAX(TW)
FROM(SELECT t.Loc,t.id,AVG(RSSI)爲w
從x組通過 Loc,id)t
group by t.Loc
order by 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; 
+2

我有點失去了你的桌子上你的目標數據選擇。這是真實的數據嗎?你餐桌上的loc 53在哪裏? – EoinS

+0

告訴我們「你有點失落」並不能給我們任何幫助你的方式。*你收到了什麼,你期望什麼? –

回答

0

這是棘手!我們來看看它。你可以沿着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 
; 

這給了你所期望的結果

+0

感謝你,我想出了另一種可能的解決方案,沒有櫃檯。它更短:'select t.loc,t.id,tw FROM(SELECT loc,id,avg(rssi)as w FROM p group by loc,id order by loc,w desc)t GROUP BY t.Loc ;'謝謝! – agonza1