计算PostgreSQL中的每日总和

时间:2014-05-01 12:23:37

标签: 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;

查询成功返回,所以我以为我已经成功了。但是,当我试图将函数的值插入表(这可能是错误的)时:

INSERT INTO "SumValues"
("EnergyDC") 

    (
     SELECT sumvalues()
     ); 

我明白了:

错误:类型间隔的输入语法无效:" 01-01-2005 00:00:00" 第3行:在哪里。"日期时间" =天(' 01-01-2005 00:00:00' + INTERVAL ......

我试图自己调试但是我不确定,我做错了哪两个(或两个)以及为什么。

以下是EnergyWh

的示例

(我使用systemid和datetime作为复合PK,但这无关紧要)

2 个答案:

答案 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

参考:Dynamic query in pgsql