首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Postgres plperl -创建平均决策的聚合函数。

Postgres plperl -创建平均决策的聚合函数。
EN

Stack Overflow用户
提问于 2016-07-12 05:36:19
回答 1查看 88关注 0票数 1

我试图取一个日期的所有dBm值并对它们进行平均值,但是要达到平均dBm值,需要将它们转换为瓦特,平均,然后再转换回dBm。

这是我用plperl做的尝试。

代码语言:javascript
复制
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;

运行此函数时遇到的错误是:

代码语言:javascript
复制
ERROR:  column "data.dbm" must appear in the GROUP BY clause or be used in an aggregate function

我想我快要有这个权利了,但我似乎搞不清楚。查询只需要按日期聚合,并将该日期的所有dbm值平均为一个值。

有什么想法或解决办法吗?

编辑:更新的plsql代码以获得正确的perl变量名。

更新:

我将SQL更改为:

代码语言:javascript
复制
SELECT db_agg( dbm ) FROM data GROUP BY meas_date;

得到这个错误:

代码语言:javascript
复制
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中的这一行代码中。

代码语言:javascript
复制
$watts = $watts + ( 10 ** ( $dbm / 10 ) ) / 1000;

具体来说,$dbm不想被除以10.

我尝试将函数更改为使用非数组的双精度数据类型,但这似乎行不通。我还试着添加0,比如在MySQL中,希望实现自动转换,但失败了。

在除法中使用数据类型之前,是否需要对数组数据类型进行处理?

EN

回答 1

Stack Overflow用户

发布于 2016-07-12 06:02:13

尝试使用聚合,而不是函数:

代码语言:javascript
复制
SELECT db_agg(dbm) 
FROM data 
GROUP BY meas_date;

在功能体中不应该用$avg_watts代替$decimal吗?

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38320755

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档