mysql中运行总计的字段的平均值

时间:2014-05-15 17:54:07

标签: mysql sql database

我目前正在使用以下MySQL查询来获取运行总计并在条件

时返回它
SELECT id, @rn as total
FROM table
JOIN (
SELECT @rn :=0
)rn
WHERE (
@rn := @rn + amount
) > 130
ORDER BY id ASC
LIMIT 1

表格如下

id  | amount | rate
20  |  120   | 5.2
21  |  22    | 6.1
22  |  16    | 3.8

现在我想选择(使用上面的查询)平均值或用于累计运行总计的行的rate字段;即目前上面的查询将返回:

id  | total
21  |  142 

但是我想返回

id  | total | avg_rate
21  |  142   | 5.65

我曾尝试简单地选择AVG(rate),但这始终会返回所有行的平均值,而不仅仅是在运行总计中添加的行。

2 个答案:

答案 0 :(得分:1)

虽然您没有使用SQL2012,但这可能对您或其他人有所帮助:

DECLARE @myTable TABLE
(
    Id      int,
    Amount  decimal(18,2),
    Rate    decimal(18,2)
);

INSERT INTO @myTable VALUES(20, 120, 5.2)
INSERT INTO @myTable VALUES(21, 22, 6.1)
INSERT INTO @myTable VALUES(22, 16, 3.8)

select Id, 
    Amount,
    Rate,
    sum(Amount) OVER (ORDER BY Id
                      ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) as RunningTotal,
    avg(Rate) OVER (ORDER BY Id 
                    ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) as RunningAvg
FROM @myTable

结果如下:

Id  Amount  Rate    RunningTotal    RunningAvg
20  120.00  5.20    120.00  5.200000
21  22.00   6.10    142.00  5.650000
22  16.00   3.80    158.00  5.033333

否则,这里有decent link解释运行总计和平均值。

答案 1 :(得分:0)

好的,所以在这里使用用户变量之后是一个解决方案,基本上我需要跟踪运行总量,以及运行总计的速率以及行数来计算用户设置变量的平均值。我考虑过避免这个查询选择所有行,然后使用PHP计算平均值,但我相信这将更具可移植性和可扩展性。

SELECT t.id, @rn , @avg_rate , @num_rows , ROUND( @avg_rate / @num_rows , 2 )
FROM (

SELECT @rn :=0, @avg_rate :=0, @num_rows :=0
)d
JOIN (

SELECT id, amount, rate
FROM table
ORDER BY id DESC
)t
WHERE (
@num_rows := @num_rows +1
)
AND (
@avg_rate := @avg_rate + t.rate
)
AND (
@rn := @rn + t.amount
) > 150
LIMIT 1