我在postgres中相当新,我想要做的是计算每个月每天的总和值(即每日总和值)。基于散射信息,我想出了类似的东西:
CREATE OR REPLACE FUNCTION sumvalues() RETURNS double precision AS
$BODY$
BEGIN
FOR i IN 0..31 LOOP
SELECT SUM("Energy")
FROM "public"."EnergyWh" e
WHERE e."DateTime" = day('01-01-2005 00:00:00'+ INTERVAL 'i' DAY);
END LOOP;
END
$BODY$
LANGUAGE plpgsql VOLATILE NOT LEAKPROOF;
ALTER FUNCTION public.sumvalues()
OWNER TO postgres;
查询成功返回,所以我以为我已经成功了。但是,当我试图将函数的值插入表(这可能是错误的)时:
INSERT INTO "SumValues"
("EnergyDC")
(
SELECT sumvalues()
);
我明白了:
错误:类型间隔的输入语法无效:" 01-01-2005 00:00:00" 第3行:在哪里。"日期时间" =天(' 01-01-2005 00:00:00' + INTERVAL ......
我试图自己调试但是我不确定,我做错了哪两个(或两个)以及为什么。
以下是EnergyWh
的示例(我使用systemid和datetime作为复合PK,但这无关紧要)
答案 0 :(得分:1)
请参阅GROUP BY子句http://www.postgresql.org/docs/9.2/static/tutorial-agg.html
SELECT EXTRACT(day FROM e."DateTime"), EXTRACT(month FROM e."DateTime"),
EXTRACT(year FROM e."DateTime"), sum("Energy")
FROM "public"."EnergyWh" e
GROUP BY 1,2,3
但是以下查询也应该起作用:
SELECT e."DateTime"::date, sum("Energy")
FROM "public"."EnergyWh" e
GROUP BY 1
我正在使用第一列的GROUP BY~GROUP BY 1 ..组的简短语法。
答案 1 :(得分:-1)
以下是可以帮助您的简单示例:
表:
create table demo (value double precision);
<强>功能强>
CREATE OR REPLACE FUNCTION sumvalues() RETURNS void AS
$BODY$
DECLARE
inte text;
BEGIN
FOR i IN 0..31 LOOP
inte := 'INSERT INTO demo SELECT EXTRACT (DAY FROM TIMESTAMP ''01-01-2005 00:00:00''+ INTERVAL '''||i||' Days'')';
EXECUTE inte;
END LOOP;
END
$BODY$
LANGUAGE plpgsql VOLATILE NOT LEAKPROOF;
ALTER FUNCTION public.sumvalues()
OWNER TO postgres;
功能调用
SELECT sumvalues();
<强>输出强>
SELECT * FROM demo;
这里,如果你想在SQL查询中使用一些变量值,你必须使用一些 DYNAMIC QUERY 。