PGSQL - 中位数函数 - 错误

时间:2014-04-02 04:44:42

标签: postgresql syntax-error median

我想在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。但我不确定我需要做出哪些改变。

任何帮助将不胜感激

1 个答案:

答案 0 :(得分:0)

此页面指明了如何使用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 < 5的记录),则结果将被假定为NULL并且不会调用该函数。所以你需要确定你所在的地方可以解决这个问题。