使用 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。