使用 SQL 中的平均值更新列
Update a column with averages values in SQL
我正在尝试通过对另一列(值)的最后 3 个值进行平均来更新列 (avgVal)。现在,avgVal 取最后 2 个的平均值。
id values avgVal
1 2.0 2.0 // average of 2
2 3.0 2.5 // average of 2 and 3
3 4.0 3.5 // average of 3 and 4
4 5.0 4.5 // average of 4 and 5
我想:
id values avgVal
1 2.0 2.0 // average of 2
2 3.0 2.5 // average of 2 and 3
3 4.0 3.0 // average of 2, 3 and 4
4 5.0 4.0 // average of 3, 4 and 5
我能得到的最好的是:
UPDATE f16 SET avgVal= AVG(values) OVER (ORDER BY id ASC BETWEEN 2 PRECEDING AND CURRENT ROW)
但是 window 功能在这里不起作用。
请问有什么建议吗?
非常感谢
一种方法是相关子查询:
update f16
set avgval = (select avg(f2.val)
from (select f2.*
from f16 f2
where f2.id <= f.id
order by f2.id desc
fetch first 3 rows only
) f2
);
这可能不是最有效的方法。但是没有数据库标签,很难提出其他建议。
鉴于您的最后一个问题是关于 MariaDB 的,以上内容在 MariaDB 中不起作用。相反,您可以使用 join
:
update f16 join
(select f16.*,
avg(val) over (order by id
rows between 2 preceding and current row
) as avgval_3
from f16
) f2
on f16.id = f2.id
set f16.avgval = f2.avgval_3;
这也可行,您已经计算了最后 2 个平均值,您可以用它来计算新的平均值:
UPDATE f16
LEFT JOIN f16 t on t.id = f16.id-2
SET f16.avgVal = IF(t.values IS NULL, f16.avgVal, (f16.avgVal*2+t.values) / 3)
在不了解您的数据集和索引的情况下,很难猜测性能,请使用 EXPLAIN 与其他答案的解决方案进行比较。我认为这应该适用于所有人 SQL。
我正在尝试通过对另一列(值)的最后 3 个值进行平均来更新列 (avgVal)。现在,avgVal 取最后 2 个的平均值。
id values avgVal
1 2.0 2.0 // average of 2
2 3.0 2.5 // average of 2 and 3
3 4.0 3.5 // average of 3 and 4
4 5.0 4.5 // average of 4 and 5
我想:
id values avgVal
1 2.0 2.0 // average of 2
2 3.0 2.5 // average of 2 and 3
3 4.0 3.0 // average of 2, 3 and 4
4 5.0 4.0 // average of 3, 4 and 5
我能得到的最好的是:
UPDATE f16 SET avgVal= AVG(values) OVER (ORDER BY id ASC BETWEEN 2 PRECEDING AND CURRENT ROW)
但是 window 功能在这里不起作用。 请问有什么建议吗?
非常感谢
一种方法是相关子查询:
update f16
set avgval = (select avg(f2.val)
from (select f2.*
from f16 f2
where f2.id <= f.id
order by f2.id desc
fetch first 3 rows only
) f2
);
这可能不是最有效的方法。但是没有数据库标签,很难提出其他建议。
鉴于您的最后一个问题是关于 MariaDB 的,以上内容在 MariaDB 中不起作用。相反,您可以使用 join
:
update f16 join
(select f16.*,
avg(val) over (order by id
rows between 2 preceding and current row
) as avgval_3
from f16
) f2
on f16.id = f2.id
set f16.avgval = f2.avgval_3;
这也可行,您已经计算了最后 2 个平均值,您可以用它来计算新的平均值:
UPDATE f16
LEFT JOIN f16 t on t.id = f16.id-2
SET f16.avgVal = IF(t.values IS NULL, f16.avgVal, (f16.avgVal*2+t.values) / 3)
在不了解您的数据集和索引的情况下,很难猜测性能,请使用 EXPLAIN 与其他答案的解决方案进行比较。我认为这应该适用于所有人 SQL。