【问题标题】:PGSQL - Median Function - ErrorPGSQL - 中值函数 - 错误
【发布时间】:2014-04-02 04:44:42
【问题描述】:

我想在 pgsql 中找到一些数据的中值。一个快速的谷歌搜索告诉我 PGSQL 8.2 没有中值函数。经过更多搜索后,我找到了此链接 https://wiki.postgresql.org/wiki/Aggregate_Median

它提供了一些关于如何编写自定义中值函数的信息。这是我到目前为止的代码

        CREATE OR REPLACE FUNCTION my_schema.final_median(anyarray) RETURNS float8 STRICT AS
        $$ 
        DECLARE
          cnt INTEGER;
        BEGIN
          cnt := (SELECT count(*) FROM unnest($1) val WHERE val IS NOT NULL);
          RETURN (SELECT avg(tmp.val)::float8 
                    FROM (SELECT val FROM unnest($1) val
                            WHERE val IS NOT NULL 
                            ORDER BY 1 
                            LIMIT 2 - MOD(cnt, 2) 
                            OFFSET CEIL(cnt/ 2.0) - 1
                          ) AS tmp
                 );
        END
        $$ LANGUAGE plpgsql;

        CREATE AGGREGATE my_schema.mymedian(anyelement) (
          SFUNC=array_append,
          STYPE=anyarray,
          FINALFUNC=my_schema.final_median,
          INITCOND='{}'
        );

-- I need this filter here. This is a place holder for a larger query    
    select my_schema.mymedian(id) filter (where id < 5)
    from my_schema.golf_data

但是当我运行代码时出现错误

ERROR:  function my_schema.mymedian(numeric) is not defined as STRICT
LINE 27: select my_schema.mymedian(id) filter (where id < 5)
                ^
HINT:  The filter clause is only supported over functions defined as STRICT.
********** Error **********

ERROR: function my_schema.mymedian(numeric) is not defined as STRICT
SQL state: 0AM00
Hint: The filter clause is only supported over functions defined as STRICT.
Character: 661

我猜解释器希望我在某处添加关键字 strict。但我不确定我需要在哪里进行此更改。

任何帮助将不胜感激

【问题讨论】:

标签: postgresql syntax-error median


【解决方案1】:

此页面说明如何使用STRICT 关键字及其作用:

http://www.postgresql.org/docs/8.2/static/sql-createfunction.html

所以试试这个:

CREATE OR REPLACE FUNCTION my_schema.final_median(anyarray) RETURNS float8 STRICT AS

重要提示: 使用STRICT 的影响是,如果您的输入是NULL(在您的情况下,如果没有id &lt; 5 的记录),那么结果将被假定为NULL,并且不会调用该函数。所以你需要确保你调用它的地方可以处理这个问题。

【讨论】:

  • 感谢您的帮助。我已经更新了我的代码以纳入您的建议,但我仍然得到同样的错误。添加到原始帖子的更新
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多