我试图获取一个日期的所有dBm值并对其进行平均,但是要平均dBm,需要将它们转换为瓦特,平均,然后转换回dBm。
这是我用 plperl 尝试的。
CREATE OR REPLACE FUNCTION avg_dbm(double precision[]) RETURNS integer AS $$
my $watts = 0;
my $watt_count = 0;
foreach my $dbm ( @_ ) {
$watts = $watts + ( 10 ** ( $dbm / 10 ) ) / 1000;
$watt_count++;
}
my $avg_watts = $watts / $watt_count;
my $avg_dbm = 10 * log( 1000 * $avg_watts ) / log(10);
return $avg_dbm;
$$ LANGUAGE plperl;
DROP AGGREGATE IF EXISTS db_agg( double precision );
CREATE AGGREGATE db_agg ( double precision ) (
sfunc = array_append,
stype = double precision[],
finalfunc = avg_dbm
);
SELECT avg_db( dbm ) FROM data GROUP BY meas_date;
运行此函数时遇到的错误是:
ERROR: column "data.dbm" must appear in the GROUP BY clause or be used in an aggregate function
我想我已经接近拥有这个权利,但似乎无法弄清楚。 查询只需按日期聚合,并将该日期的所有 dbm 值平均为一个值。
有什么想法或解决方案吗?
编辑:更新了 plsql 代码以获得正确的 perl 变量名称
更新:
我将 SQL 更改为:
SELECT db_agg( dbm ) FROM data GROUP BY meas_date;
并得到此错误:
ERROR: Operation "/": no method found,
left argument in overloaded package PostgreSQL::InServer::ARRAY,
right argument has no overloaded magic at line 7.
CONTEXT: PL/Perl function "avg_dbm"
有问题的部分在 plperl 中的这行代码中
$watts = $watts + ( 10 ** ( $dbm / 10 ) ) / 1000;
具体来说,$dbm不想被除以 10...
我尝试更改函数以使用非数组双精度数据类型,但这似乎不起作用。 我还尝试像在 MySQL 中添加 0 一样,希望进行自动转换,但失败了。
在除法中使用数组数据类型之前,是否需要对数组数据类型进行一些处理?
尝试使用聚合,而不是函数:
SELECT db_agg(dbm)
FROM data
GROUP BY meas_date;
不应该$avg_watts
代替函数体中的$decimal
吗?