Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL汇总每个类别的前2条记录_Mysql_Sql_Greatest N Per Group - Fatal编程技术网

MySQL汇总每个类别的前2条记录

MySQL汇总每个类别的前2条记录,mysql,sql,greatest-n-per-group,Mysql,Sql,Greatest N Per Group,我有一个学生成绩表,我试图为某一特定类别的所有学生合计前2名的分数。我搜索过类似的帖子,但没有得到正确的答案 我试着把分数加起来,但只得到了两个学生的结果,而不是所有学生的结果,这并没有给我正确的值 SELECT SUM(marks) as totalmarks,stdid FROM (( select marks,stdid from finalresult where `subjectcategory` = 1

我有一个学生成绩表,我试图为某一特定类别的所有学生合计前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只需要两个


辅助子查询可用于迭代

    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 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;

那么你想把每个学生在给定的班级、学期、年份和类型中的前2名分数相加?所以每个学生都应该得到前两行的总和,所有学生都应该显示出来?你知道你使用的mysql是什么版本吗?所以你想对每个学生在给定的班级、学期、年份和类型上的前两名分数进行总和?所以每个学生都应该得到上面两行的总和,所有学生都应该显示出来。你知道你使用的mysql是什么版本吗?这个只给2个学生和我想要所有学生的总和,这个只给2个学生和我想要所有学生的总和