每条记录的 Postgresql 时间序列
Postgresql Time Series for each Record
我在思考如何从我的 Postgres 数据库中提取一些时间序列统计信息时遇到问题。
比如我有好几家店。我在 table 中记录每家商店每天的销售额,如下所示:
+------------+----------+-------+
| 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 |
+------------+----------+-------+
我试图在 bar/line 图表上显示此数据,每个商店有不同的行,空白日期用 0 填充。
我已经成功地使用 generate_series
让它显示每天的总和(将所有商店合并为一个总和),但我不知道如何将它分开,所以每个商店都有一个每天的价值......结果是这样的:
["Store ID 1", 10, 0, 11, 0]
["Store ID 2", 20, 0, 21, 0]
["Store ID 3", 0, 0, 0, 30]
需要建立交叉连接日期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);
我在思考如何从我的 Postgres 数据库中提取一些时间序列统计信息时遇到问题。
比如我有好几家店。我在 table 中记录每家商店每天的销售额,如下所示:
+------------+----------+-------+
| 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 |
+------------+----------+-------+
我试图在 bar/line 图表上显示此数据,每个商店有不同的行,空白日期用 0 填充。
我已经成功地使用 generate_series
让它显示每天的总和(将所有商店合并为一个总和),但我不知道如何将它分开,所以每个商店都有一个每天的价值......结果是这样的:
["Store ID 1", 10, 0, 11, 0]
["Store ID 2", 20, 0, 21, 0]
["Store ID 3", 0, 0, 0, 30]
需要建立交叉连接日期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);