这与标记为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
任何人对我都有任何想法?
答案 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