我想编写一个返回所有行的查询,直到其中一列值的总和达到某个值.
例如,在下表中:
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)
这是一种没有存储过程的方法:
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)
这是一种适用于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.
这一个胜过所有。
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)
查看两个查询的执行计划。
| 归档时间: |
|
| 查看次数: |
18462 次 |
| 最近记录: |