【问题标题】:Postgresql Time Series for each Record每条记录的 Postgresql 时间序列
【发布时间】:2017-02-23 14:02:07
【问题描述】:

我在试图解决如何从我的 Postgres 数据库中提取一些时间序列统计数据时遇到问题。

例如,我有几家商店。我在一张表格中记录了每家商店每天的销售额,如下所示:

+------------+----------+-------+
|    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]

【问题讨论】:

    标签: postgresql time-series aggregate timeserieschart


    【解决方案1】:

    需要建立一个cross join dates X stores:

    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);
    

    【讨论】:

      猜你喜欢
      • 2017-03-31
      • 1970-01-01
      • 1970-01-01
      • 2019-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-19
      • 1970-01-01
      相关资源
      最近更新 更多