2016-11-19 1 views
2

Entschuldigung mein Englisch. Ich bin mir nicht sicher, ob dies in MySQL möglich ist.Finden Top 10% der gekauften Produkte pro Gruppe dann finden Sie Durchschnitt dieser 10%

Ich versuche zu:

  1. finden Sie die Top 10% der Noten pro groupid
  2. dann den Durchschnitt von Partituren für jene 10% von groupid

Probenteilmenge von Daten:

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 
... 

...

Ist das möglich? Danke im Voraus.

+0

Welchen Teil Ihres Englisch erfordert begnadigen? – Strawberry

+0

brauchst du den Punkt '1.'? oder ist es nur ein Schritt, um die '2.' zu bekommen und Sie können direkt den Durchschnitt der 10% von Groupid herausziehen? – Blag

Antwort

0

Sie können es tun, aber es ist ein bisschen schwierig. . . Variablen sind die einfachste Methode:

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

Danke für die schnelle Antwort. Es gab jedoch null Zeilen zurück. Ich benutze MySQL 5.7.12. – xerlil

+0

@xerlil. . . Meine Vermutung ist, dass Ihre Gruppen ziemlich klein sind. Ich ändere das 'where' um sicherzustellen, dass mindestens eine Zeile in jeder Gruppe ist. –

Verwandte Themen