将行限制为一个列的总和等于MySQL中的某个值

Hem*_*ant 13 mysql sql

我想编写一个返回所有行的查询,直到其中一列值的总和达到某个值.

例如,在下表中:

           DATE             ETC      Meeting
    2013-02-01 00:00:00    85482        1
    2013-02-01 00:00:00    47228        2
    2013-02-02 00:00:00    12026        4
    2013-02-03 00:00:00    78927        6
    2013-02-04 00:00:00    85662        2
    2013-03-05 00:00:00    47978        1
    2013-08-07 00:00:00     8582        1
Run Code Online (Sandbox Code Playgroud)

如果我想获取行,直到列的总和Meeting等于7.

           DATE             ETC      Meeting
    2013-02-01 00:00:00    85482        1
    2013-02-01 00:00:00    47228        2
    2013-02-02 00:00:00    12026        4
Run Code Online (Sandbox Code Playgroud)

如果我想获取行,直到列的总和Meeting等于13.

     DATE                   ETC      Meeting
    2013-02-01 00:00:00    85482        1
    2013-02-01 00:00:00    47228        2
    2013-02-02 00:00:00    12026        4
    2013-02-03 00:00:00    78927        6
Run Code Online (Sandbox Code Playgroud)

too*_*cts 8

这是一种没有存储过程的方法:

SET @msum := 0;
SELECT t1.* 
FROM (
    SELECT m.*,  
          (@msum := @msum + m.meetings) AS cumulative_meetings
    FROM meetings m 
    ORDER BY m.date ASC
) t1 
WHERE t1.cumulative_meetings <= 7;
Run Code Online (Sandbox Code Playgroud)


DMK*_*DMK 6

这是一种适用于MySQL的方法:

SELECT
  O.Id,
  O.Type,
  O.MyAmountCol,
  (SELECT
     sum(MyAmountCol) FROM Table1
   WHERE Id <= O.Id) 'RunningTotal'
FROM Table1 O
HAVING RunningTotal <= 7
Run Code Online (Sandbox Code Playgroud)

它涉及计算运行总计并在运行总数小于或等于给定数量时选择记录,在这种情况下7.

SQL小提琴


val*_*lis 5

这一个胜过所有。

SET @runningTotal=0;
SELECT
  O.Id,
  O.Type,
  O.MyAmountCol,
  @runningTotal + O.MyAmountCol as 'RunningTotal',
  @runningTotal := @runningTotal + O.MyAmountCol
FROM Table1 O
HAVING RunningTotal <=7;
Run Code Online (Sandbox Code Playgroud)

SQL小提琴

查看两个查询的执行计划。