我目前正在使用以下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)
,但这始终会返回所有行的平均值,而不仅仅是在运行总计中添加的行。
答案 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