在 PostgreSQL 中计算每日总和

Ele*_*a_K 3 postgresql sum

我对 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,但这应该不重要)

Pav*_*ule 7

请参阅 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 .. 按第一列分组的简短语法。