2016-07-14 3 views
0

私は以下を実行しようとしています。私はLocの各IDでグループ化された最大平均を取得したいと思いMySQL最大平均を2つのフィールドでグループ化しました

id | rssi | Loc 

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

:私は、この表xを持っています。言い換えれば、平均をLocidでグルーピングしてから、最大で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 

この最初の部分はLOCとidごとにグループ化するRSSIの平均をやっているが、後でここで私場所です

選択のLoc、ID、マックス(TW)

ワットとして(t.Locを選択、t.id、AVG(RSSI)FROM:失われた少しですFROM xグループby Loc、id)t
グループ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

を与える私はあなたの目標データの選択にあなたのテーブルの上に失わ少しです。この実データですか?あなたのテーブルにはどこに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(loc、ID、avg(rssi)をwとして選択します。 からp をグループ、loc順、idを順番に並べます)GROUP BY t.Loc ;「ありがとう! – agonza1

関連する問題