2017-04-12 34 views
1

這與標記爲雙人的不同,我想總結每支球隊的前5名。雙重職位取出每個結果在不同的行。爲每支球隊選擇前5名得分

我現在正在使用這個問題,但似乎SQL是隨機返回5爲例行10行和總結,而不是前5名。任何人有一些輸入給我?

選擇團隊,總和(長度)作爲totalScore 從 (SELECT T *, @num_in_group:=情況下,當@team =團隊然後@num_in_group:!= 0,否則,@num_in_group:= @ num_in_group + 1個端如num_in_group, @team:=團隊爲t FROM reg_catches噸,(選擇@team:= - 1,@num_in_group:= 0)初始化 ORDER BY團隊ASC)子 WHERE sub.num_in_group < = 4和競爭= 16和球隊= 25 GROUP BY球隊 ORDER BY totalScore DESC;

我很困擾SQL問題,我無法擺脫困境。我的結果表如下所示,我試圖總結每支球隊的前5名成績,並將輸出限制在前3名排名最高的球隊。一切都按預期工作,直到我在結果表中添加了最後一個分數。我的SQL的輸出現在是隨機團隊25.我預計是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 

輸出:

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

通緝輸出:

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 

任何人有對我有什麼想法?

+0

由於未能包含PRIMARY KEY而導致此問題不必要的複雜化。 – Strawberry

回答

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

這是完美的!感謝您的快速響應和解決方案! –

+0

嗨!我現在有問題,現在當我們與這個網站生活在一起.. :( 似乎查詢返回隨機5結果和總結這一點,我想總結前5 .. 任何人對我有什麼想法? –

0

您應該使用窗口函數來完成此操作。以下是一個查詢示例:

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; 

該查詢有兩部分。

內部查詢使用row_number()窗口函數爲每行提供一個額外的列,指示其排名。 PARTITION BY team表示應該爲每個團隊分別保存排名,這樣你最終能夠爲每個團隊選擇排名前n分數。

外部查詢對內部查詢的結果使用SUM,每個團隊的行數小於或等於5的所有分數 - 換句話說,前5個分數。

+1

MySQL沒有窗口函數,那就是SQL-Server。 – Barmar

+1

感謝您的幫助,如上所述,這不適用於我的MariaDB,但無論如何非常感謝您的幫助,並希望它能幫助別人!最好的問候,基督教 –