为每个团队选择前5个分数

时间:2017-04-12 15:54:56

标签: mysql sql

这与标记为double的那个不同,我想总结每个团队的前5名。双重帖子在单独的行中取出每个结果。

我现在正在使用这个问题,但似乎SQL随机返回了5行,并且总结了10行,而不是前5位。任何人都有一些输入给我?

选择团队,总和(长度)作为totalScore 从    (选择t。*,        @num_in_group:= @team!= team然后@num_in_group:= 0的情况@num_in_group:= @ num_in_group + 1结束为num_in_group,        @team:=团队为t     FROM reg_catches t,(选择@team:= - 1,@ num_in_group:= 0)init     ORDER BY team asc)sub 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

任何人对我都有任何想法?

2 个答案:

答案 0 :(得分: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分数。

外部查询在内部查询的结果上使用GROUP BY来获取每个团队的SUM所有其行数小于或等于5的分数 - 在其他单词,前5名。

答案 1 :(得分:0)

select team, sum(length) 
from
   (SELECT t.*,
       @num_in_group:=case when @team!=team then @num_in_group:=0 else @num_in_group:=@num_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