sql - Average 函数在关系数据库中如何工作?

标签 sql math rdbms

我正在尝试从包含数百万行的表中查找值的几何平均值。对于那些不知道的人,要找到几何平均值,请将每个值相互乘以,然后除以行数。

您可能已经发现了问题;这个数字相乘的数字很快就会超过系统允许的最大值。我找到了一个使用自然对数的出色解决方案。

http://timothychenallen.blogspot.com/2006/03/sql-calculating-geometric-mean-geomean.html

但这让我想知道同样的问题是否也适用于算术平均值?如果您有 N 条记录,并且 N 非常大,则运行总和也可能会超过系统最大值。

那么 RDMS 如何在查询期间计算平均值?

最佳答案

我不知道 RDBMS 中算术平均值的确切实现,您也没有在原始问题中指定一个。但 RDBMS 不需要对一列中的一百万行求和来获得算术平均值。考虑以下总结:

sum = (x1 + x2 + x3 + ... + x1000000)

那么平均值可以写为

mean = sum / N = (x1 + x2 + x3 + ... + x1000000) / N, for N = 1,000,000

但是这个表达式可以分解成这样的部分:

mean = [(x1 + x2 + x3) / N ] + [(x4 + x5 + x6) / N] + ...

换句话来说,RDBMS 可以简单地扫描一列中的百万行并逐段查找平均值,而无需担心溢出的风险。并且由于列中的每个数字可能都在存储它的类型的范围内,因此平均值本身不会溢出。

关于sql - Average 函数在关系数据库中如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32194754/

相关文章:

javascript:计算数字的 x%

javascript - 在 JavaScript 中是否可以定义负数的平方根?

mysql - 如果我在列上创建索引但对多个列进行查询(其中一个列是索引列),查询处理速度是否很快?

python - 我收到警告 <RuntimeWarning : invalid value encountered in sqrt>

sql - 在一个表中有不同用户的记录 - SQL Server

mysql - 日期之间的 CASE 语句

java - SQL异常 : executeQuery method can not be used for update

architecture - 设计辩论 : what are good ways to store and manipulate versioned objects?

mysql - mysql 中的 'IN' 运算符中可以存在的值数量是否有限制?

sql - psql:尽管存在关系,但未找到任何关系