2016-11-19 2 views
2

私の英語を赦してください。これがMySQLで可能かどうかはわかりません。グループごとに購入した製品の上位10%を見つけ、それらの平均を見つける10%

は私がしようとしている:グループIDごとの得点の上位10%を見つける

  1. 、その後のグループID

サンプルサブセットによって、それらの10%のスコアの平均 を見つけますデータ:

Table name: points 

groupid  score 
group_001  13 
group_001  12 
group_001  10 
group_001  12 
... 
group_002  12 
group_002  16 
group_002  19 
group_002  20 
group_002  12 
group_002  13 
... 
group_003  29 
group_003  21 
group_003  18 
... 

...

これは可能ですか?前もって感謝します。

+0

あなたの英語のうち、どの部分が虐待を必要としていますか? – Strawberry

+0

ポイント '1'が必要ですか?それとも '2.'を得るための一歩ですか?そして、あなたはgroupidによって10%の平均値を直接引き出すことができますか? – Blag

答えて

0

あなたはそれをすることはできますが、ややこしいことです。 。 。変数は最も簡単な方法です:

select group_id, avg(score) 
from (select p.*, 
      (@rn := if(@g = group_id, @rn + 1, 
         if(@g := group_id, 1, 1) 
         ) 
      ) as seqnum 
     from points p cross join 
      (select @rn := 0, @g := -1) params 
     order by group_id, score desc 
    ) p join 
    (select group_id, count(*) as cnt 
     from points 
     group by group_id 
    ) pp 
    on pp.group_id = p.group_id 
where (seqnum - 1) * 10 <= pp.cnt 
group by group_id; 
+0

迅速な対応に感謝します。ただし、ゼロ行が返されました。私はMySQL 5.7.12を使用しています。 – xerlil

+0

@ xerlil。 。 。私の推測ではあなたのグループはかなり小さいということです。私は 'where'を変更して、各グループに少なくとも1つの行があることを確認します。 –

関連する問題