我对 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;
Run Code Online (Sandbox Code Playgroud)
查询成功返回,所以我认为我已经成功了。但是,当我尝试将函数的值插入表中时(这可能是错误的):
INSERT INTO "SumValues"
("EnergyDC")
(
SELECT sumvalues()
);
Run Code Online (Sandbox Code Playgroud)
我明白了:
错误:间隔类型的输入语法无效:“01-01-2005 00:00:00”第 3 行:WHERE e."DateTime" = day('01-01-2005 00:00:00'+ INTERVAL...
我尝试自己调试它,但不确定我做错了哪一个(或两者)以及为什么。
这是EnergyWh的示例
(我使用 systemid 和 datetime 作为复合 PK,但这应该不重要)
请参阅 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
Run Code Online (Sandbox Code Playgroud)
但以下查询也应该有效:
SELECT e."DateTime"::date, sum("Energy")
FROM "public"."EnergyWh" e
GROUP BY 1
Run Code Online (Sandbox Code Playgroud)
我正在使用 GROUP BY ~ GROUP BY 1 .. 按第一列分组的简短语法。