Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从SQL中包含开始和结束字段的表中创建每日记录总和_Sql_Postgresql_Time Series - Fatal编程技术网

如何从SQL中包含开始和结束字段的表中创建每日记录总和

如何从SQL中包含开始和结束字段的表中创建每日记录总和,sql,postgresql,time-series,Sql,Postgresql,Time Series,我有下表 startdate enddate activity 1/1/2015 1/3/2015 foo 1/2/2015 1/6/2015 bar 1/4/2015 1/7/2015 bar 如何查询以获得以下每日金额 date foo bar 1/1/2015 1 0 1/2/2015 1 1 1/3/2015 0 1 1/4/2015 0 2 1/5/2015 0 2 1/6/2015

我有下表

startdate   enddate activity
1/1/2015    1/3/2015    foo
1/2/2015    1/6/2015    bar
1/4/2015    1/7/2015    bar
如何查询以获得以下每日金额

date    foo bar
1/1/2015    1   0
1/2/2015    1   1
1/3/2015    0   1
1/4/2015    0   2
1/5/2015    0   2
1/6/2015    0   1
1/7/2015    0   0
如果有帮助的话,我正在使用PSQL

我假设这是一个简单的问题,但我在搜索时似乎找不到答案。也许我没有用正确的术语来描述。感谢您的帮助

您可以使用generate_series和aggregation。比如说:

select dte,
       sum((activity = 'foo')::int) as foo,
       sum((activity = 'bar')::int) as bar
from (select generate_series(startdate, enddate, interval '1 day') as dte,
             activity
      from t
     ) t
group by dte
order by dte;

请注意,generate_系列具有高度的Postgres特定性。但是,它非常方便。

我们可以通过生成更多活动案例使其更具动态性

参考Gordon Linoff的答案,我创建了postgresql函数,它可以使活动案例更加动态

检查以下功能:

create or replace function  sp_test()
returns void as
$$

declare cases character varying;
declare sql_statement text;
begin



select string_agg(distinct concat('sum((activity=','''',activity,'''',' )::int) as ',activity,' '),',') into cases from your_tbl;

drop table if exists temp_data;

sql_statement=concat('create temporary table temp_data as select t.dte, ',cases,'from 
(select generate_series(startdate, enddate, interval ','''1 day''',') as dte,
         activity
      from your_tbl) as t group by t.dte order by t.dte');

execute sql_statement;


end;
$$
language 'plpgsql';
函数使用临时表存储动态列数据

按以下方式调用函数以获取数据:

select * from sp_test(); select * from temp_data;