如何返回特定金额的最后一行?

时间:2018-10-05 11:30:49

标签: mysql sum

想象我们有1行,该行是包含ID,名称,标记和等级的学生。编写查询以返回学生的姓氏,其中分数等于100(按年级排序)。 例子


 - id | name | marks | grade |
 - 01 | Jeff | 40    | 1 |
 - 02 | Annie| 40    | 3 |
 - 03 | Ramy | 20    | 5 |
 - 04 | Jenny| 20    | 2 |

因此结果应返回

  

Annie

因为安妮(Annie)是分数总和的最后一行,其中分数等于100。杰夫(Jeff)是基于等级等于他的1的第一个原因,因此应首先输入,第二是珍妮(Jenny),第三是安妮(Annie)。杰夫(40)+珍妮(20)+安妮(40)= 100

3 个答案:

答案 0 :(得分:1)

您可以对MySQL的用户变量进行累加运算。
该查询应在MySQL 5.1及更高版本上运行。

查询

SELECT 
 Table1_alias.name
FROM (

  SELECT 
      Table1.name
   , (@running_marks_sum := @running_marks_sum + Table1.marks) AS running_marks_sum
  FROM 
   Table1
  CROSS JOIN (SELECT @running_marks_sum := 0) AS init_user_param
  ORDER BY 
    Table1.grade ASC  
) AS Table1_alias
WHERE 
 Table1_alias.running_marks_sum = 100

结果

| name  |
| ----- |
| Annie |

View on DB Fiddle

仅限MySQL 8.0 +

查询

SELECT 
 Table1_alias.name
FROM (

  SELECT 
     Table1.name
   , SUM(Table1.marks) OVER(ORDER BY Table1.grade) AS running_marks_sum
  FROM 
    Table1

) AS Table1_alias 
WHERE 
  Table1_alias.running_marks_sum = 100;

结果

| name  |
| ----- |
| Annie |

View on DB Fiddle

答案 1 :(得分:0)

marks的累积总和保留到一个变量中。并将其用作子查询,并选择total为100的行。但是,如果没有任何行的累积总数为100,则不会得到任何结果。

查询

set @total := 0;
select `id`, `name`, `marks`, `grade` from(
    select `id`, `name`, `marks`, `grade`, (@total := @total + `marks`) as `total`
    from `your_table_name`
    order by `grade`
) as `t`
where `t`.`total` = 100;

答案 2 :(得分:0)

正如上面提到的数据库结构,下面是获取输出的一种方法

从(选择*从(选择ID,名称,等级,标记,@total:= @total +标记+选择AS总计FROM(螺柱,(select @total:= 0)t)按等级排序)中选择名称)t在哪里总数<= 100)(按降级限制1的final_view顺序