[英]MySQL SUM TOP 2 RECORDS FOR EACH CATEGORY
我有一张学生成绩表,正在尝试对所有学生在特定类别中的前2分加总。我在搜索类似的帖子,但未获得正确答案
我尝试对分数进行求和,但仅获得两个学生而不是所有学生的成绩,并且它没有给我正确的价值。
SELECT SUM(marks) as totalmarks,stdid
FROM (( select marks,stdid
from finalresult
where `subjectcategory` = 1
AND `classId`='3' AND `year`='2018'
AND `term`='2' AND `type`='23'
order by marks desc
LIMIT 2 ))t1
GROUP BY stdid
辅助子查询可用于迭代
SELECT
stdid, marks
FROM
(
SELECT stdid, marks,
@rn := IF(@iter = stdid, @rn + 1, 1) AS rn,
@iter := stdid
FROM finalresult
JOIN (SELECT @iter := NULL, @rn := 0) AS q_iter
WHERE `subjectcategory` = 1
AND `classId`='3'
AND `year`='2018'
AND `term`='2'
AND `type`='23'
ORDER BY stdid, marks DESC
) AS T1
WHERE rn <= 2
此解决方案忽略联系,每个学生ID仅需两个。
在MySQL 8+中,您可以执行以下操作:
SELECT stdid, SUM(marks) as totalmarks
FROM (SELECT fr.*,
ROW_NUMBER() OVER (PARTITION BY stdid ORDER BY marks DESC) as seqnm
FROM finalresult fr
WHERE subjectcategory = 1 AND
classId = 3 AND
year = 2018 AND
term = 2 AND
type = 23
) fr
WHERE seqnum <= 2
GROUP BY stdid;
请注意,我删除了单引号。 看起来像数字的东西可能是。 而且,您不应该混合使用类型-如果值确实存储为字符串,则将引号放回去。
在较早的版本中,可能最简单的方法是使用变量,但是您必须非常小心。 MySQL不保证SELECT
中变量的求值顺序,因此您不能在一个表达式中分配变量,而在另一个表达式中使用它。
一个复杂的表达式解决了这个问题。 另外,最好在子查询中排序(最新版本的MySQL 5+要求这样做):
SELECT stdid, SUM(marks) as totalmarks
FROM (SELECT fr.*,
(@rn := IF(@s = stdid, @rn + 1,
IF(@s := stdid, 1, 1)
)
) as seqnum
FROM (SELECT fr.*
FROM finalresult fr
WHERE subjectcategory = 1 AND
classId = 3 AND
year = 2018 AND
term = 2 AND
type = 23
ORDER BY stdid, marks DESC
) fr CROSS JOIN
(SELECT @s = '', @rn := 0) params
WHERE seqnum <= 2
GROUP BY stdid;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.