我想在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。但我不确定我需要做出哪些改变。
任何帮助将不胜感激
答案 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
并且不会调用该函数。所以你需要确定你所在的地方可以解决这个问题。