我试图取一个日期的所有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.
我尝试将函数更改为使用非数组的双精度数据类型,但这似乎行不通。我还试着添加0,比如在MySQL中,希望实现自动转换,但失败了。
在除法中使用数据类型之前,是否需要对数组数据类型进行处理?
发布于 2016-07-12 06:02:13
尝试使用聚合,而不是函数:
SELECT db_agg(dbm)
FROM data
GROUP BY meas_date;在功能体中不应该用$avg_watts代替$decimal吗?
https://stackoverflow.com/questions/38320755
复制相似问题