2017-02-23 37 views
1

我有问题试图围绕如何从我的Postgres数据库中提取一些时间序列统计信息。Postgresql每个记录的时间序列

例如,我有几家商店。我记录每个店有多少销量,看起来像一个表中的每一天进行:

+------------+----------+-------+ 
| Date | Store ID | Count | 
+------------+----------+-------+ 
| 2017-02-01 |  1 | 10 | 
| 2017-02-01 |  2 | 20 | 
| 2017-02-03 |  1 | 11 | 
| 2017-02-03 |  2 | 21 | 
| 2017-02-04 |  3 | 30 | 
+------------+----------+-------+ 

我想对每个商店不同的线和空白日期酒吧/线图已填充显示此数据0.

我已经成功地使用generate_series来显示每天的总和(将所有商店合并为一个总和),但我无法弄清楚如何分开它,因此每个商店都有一个值一天...结果是这样的:

["Store ID 1", 10, 0, 11, 0] 
["Store ID 2", 20, 0, 21, 0] 
["Store ID 3", 0, 0, 0, 30] 

回答

2

有必要建立一个交叉联接日期X专卖店:

select store_id, array_agg(total order by date) as total 
from (
    select store_id, date, coalesce(sum(total), 0) as total 
    from 
     t 
     right join (
      generate_series(
       (select min(date) from t), 
       (select max(date) from t), 
       '1 day' 
      ) gs (date) 
      cross join 
      (select distinct store_id from t) s 
     ) using (date, store_id) 
    group by 1,2 
) s 
group by 1 
order by 1 
; 
store_id | total  
----------+------------- 
     1 | {10,0,11,0} 
     2 | {20,0,21,0} 
     3 | {0,0,0,30} 

的样本数据:

create table t (date date, store_id int, total int); 
insert into t (date, store_id, total) values 
('2017-02-01',1,10), 
('2017-02-01',2,20), 
('2017-02-03',1,11), 
('2017-02-03',2,21), 
('2017-02-04',3,30); 
+0

你是个英雄。这很好,谢谢! –