我在 Postgres 中有下表:
CREATE TABLE avg (
user_id INT,
numer DOUBLE PRECISION,
denom DOUBLE PRECISION,
frac DOUBLE PRECISION
);
我想完成以下任务,但我很难将其纳入一个查询中。基本上我希望能够通过单独更新分子和分母来自动更新一些平均值,然后frac
根据新值在同一操作中计算和更新平均值:
- 给定参数
a
和b
,我想找到给定 的行user_id
,然后我想做numer += a
和denom += b
,并根据和frac = numer / denom
的新值进行计算,然后更新该行中、和 的值。numer
denom
numer
denom
frac
- 但是,如果没有请求的行
user_id
,或者有一行,但numer
和 的值为denom
空,那么我想假设这些总和的值为零,换句话说,应该将新行插入到表,或者如果有行但值为空,则应执行更新操作,结果是设置numer = a
、denom = b
、 和frac = a / b
为user_id
。 - 我想确保这一切都以原子方式发生。
给定表中可能有多个分子和分母,因此需要能够执行插入(如果该行不存在)或更新(如果该行存在但特定分子/分母对的初始值为无效的)。
最佳实践是不要在数据库中存储冗余数据。我的解决方案是
然后您可以执行您想要的操作,如下所示:
如果您坚持使用冗余表列,请使用自动更新的生成列: