2017-04-12 3 views
1

Dies ist anders als das als Doppel markierte, ich möchte die Top 5 für jedes Team zusammenfassen. Die Doppelpost nimmt für jedes Ergebnis getrennte Reihen auf.wählen Sie die besten 5 Punkte für jedes Team aus

Ich benutze diese Frage jetzt, aber es scheint, dass SQL zufällig 5 von etwa 10 Zeilen zurückgibt und zusammenzufassen, nicht die Top 5. Jeder hat etwas Input für mich?

ausgesuchtes Team, sum (Länge) als totalScore von (SELECT t *, @num_in_group:. = Fall, wenn @team = Team dann @num_in_group: = 0, sonst @num_in_group: = @ num_in_group + 1 Ende als num_in_group, @team: = Team als t FROM reg_catches t, (select @team: = - 1, @num_in_group: = 0) init ORDER BY-Team auf) sub WHERE sub.num_in_group < = 4 und = Wettbewerb 16 und team = 25 GROUP BY Team ORDER BY totalScore DESC;

Ich struggelaging auf eine SQL-Frage, die ich nicht herumkommen kann. Meine Ergebnistabelle sieht wie folgt aus: Ich versuche, die 5 besten Ergebnisse für jedes Team zusammenzufassen und die Ergebnisse auf die 3 bestplatzierten Teams zu beschränken. Alles funktionierte wie erwartet, bis ich meine letzte Punktzahl in der Ergebnistabelle hinzufügte. Die Ausgabe meiner SQL ist nun zufällig für Team 25. Ich erwartet haben, dass 520 ..

team length competition 
---------------------- 
26 70  16 
25 70  16 
25 95  16 
25 98  16 
25 100  16 
25 100  16 
25 100  16 
25 122  16 

Output:

team totalScore 
---- ----------- 
25 122 
26 70 

gewünschte Ausgabe:

team totalScore 
---- ----------- 
25 522 
26 70 


SELECT team, SUM(length) AS totalScore 
FROM(
    SELECT team, length 
    FROM table_result m 
    WHERE competition = 16 and (
    SELECT COUNT(*) 
    FROM table_result mT 
    WHERE mT.team = m.team AND mT.length >= m.length 
    ) <= 5) tmp 
GROUP BY team 
ORDER BY totalScore DESC Limit 3 

Jeder hat irgendwelche Ideen für mich?

+0

Dieses Problem wird durch das Fehlen eines PRIMARY KEY unnötig kompliziert. – Strawberry

Antwort

0
select team, sum(length) 
from 
    (SELECT t.*, 
     @num_in_group:=case when @team!=team then @num_in_group:=0 else @num_in_group:[email protected]_in_group+1 end as num_in_group, 
     @team:=team as t 
    FROM test.table_result t, (select @team:=-1, @num_in_group:=0) init 
    ORDER BY team, length desc) sub 
WHERE sub.num_in_group<=4 
GROUP BY team 
+0

Das ist einfach perfekt! Danke für Ihre schnelle Antwort und die Lösung! –

+0

Hallo! Ich habe ein Problem mit dieser Abfrage jetzt, wenn wir mit der Website leben .. :( Es scheint, dass die Abfrage zufällige 5 Ergebnisse zurückgibt und fasst dies zusammen, ich möchte es die Top 5 zusammenzufassen .. Jeder hat eine Idee für mich? –

0

Sie sollten eine Fensterfunktion verwenden, um dies zu erreichen. Hier ist eine Beispielabfrage:

SELECT team, SUM(length) AS totalScore FROM 
    (SELECT team, 
      length, 
      row_number() OVER (PARTITION BY team ORDER BY length desc) AS rowNumber 
    FROM table_result) tmp 
WHERE rowNumber <= 5 
AND competition = 16 
GROUP BY team 
ORDER BY totalScore DESC 
LIMIT 3; 

Diese Abfrage besteht aus zwei Teilen.

Die innere Abfrage verwendet die Fensterfunktion row_number(), um jeder Zeile eine zusätzliche Spalte zu geben, die ihren Rang angibt. PARTITION BY team besagt, dass der Rang für jedes Team separat gespeichert werden sollte, damit Sie die besten n Punkte für jedes Team auswählen können.

Die äußeree Abfrage verwendet ein GROUP BY auf dem Ergebnis der inneren Abfrage pro Team die SUM, zu nehmen, all der Punkte, deren Zeilennummer kleiner oder gleich 5 - mit anderen Worten, das Top-5-Scores.

+1

MySQL hat keine Fensterfunktionen, das ist SQL-Server. – Barmar

+1

Danke für deine Hilfe, wie oben gesagt funktioniert das nicht mit meiner MariaDB, aber die Hilfe wird trotzdem sehr geschätzt und hoffentlich wird es jemand anderem helfen! Mit freundlichen Grüßen, Christian –

Verwandte Themen