1、定义数据拼接函数
CREATE OR REPLACE FUNCTION "public"."sfun"("results" _numeric, "val" numeric) RETURNS "pg_catalog"."_numeric" AS $BODY$ BEGIN results :=array_append(results,val::numeric); RETURN results; END; $BODY$ LANGUAGE plpgsql VOLATILE COST 100; ALTER FUNCTION "public"."sfun"("results" _numeric, "val" numeric) OWNER TO "postgres";
2、定义数据处理函数
CREATE OR REPLACE FUNCTION "public"."sffun_o3_8h"("results" _numeric) RETURNS "pg_catalog"."numeric" AS $BODY$ DECLARE tmp integer; len integer; ret numeric[];--结果 BEGIN len=array_length(results , 1); if len<8 then return -999; end if; for i in 8..len loop tmp=0; for j in 0..7 loop tmp=tmp+results[i-j]; end loop; tmp=tmp/8::numeric; ret:=array_append(ret,tmp::numeric); end loop; ret=array_sort(ret,'asc'); RETURN ret[array_length(ret,1)]; END; $BODY$ LANGUAGE plpgsql VOLATILE COST 100; ALTER FUNCTION "public"."sffun_o3_8h"("results" _numeric) OWNER TO "postgres";
3、定义臭氧8小时触发器
CREATE AGGREGATE agg_o3_8h( BASETYPE = numeric, SFUNC = sfun, STYPE = numeric[], FINALFUNC = sffun_o3_8h );
注意事项:臭氧日最大8小时滑动平均:需要按照00时到23时将数据排序,然后才能用agg_o3_8h。顺序可用agg_string_contact(datatime)验证。如果不能保证数据的顺序,计算结果将会是错误的。
用datatime>='2020-07-05 00:00:00' and datatime<='2020-07-05 23:00:00'写法可以保证数据是按顺序排列的。
datatime>=to_timestamp(to_char(now(),'YYYY-MM-DD')||' 00:00:00','YYYY-MM-DD HH24:MI:SS') + '-24 hour' and datatime<=to_timestamp(to_char(now(),'YYYY-MM-DD')||' 23:00:00','YYYY-MM-DD HH24:MI:SS') + '-24 hour'
这个方法的使用需要非常慎重!
预报产品存储过程记录:城市日均值解决了,站点日均值没解决