postgressql-使用缺少条目的数据计算同比增长

hwamh0ep  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(291)

我有一个表,有每月的数据,有几个月的缺失条目,形式如下:
数据表

entity_id | Date(data_type: date) | Value
1         | 2018-06-01            | 100
1         | 2018-07-01            | 105
1         | 2017-06-01            | 90
1         | 2016-07-01            | 92

表中不存在2017-07的条目。
拿这些数据来计算每个月的年同比回报率,最好的方法是什么?我希望它看起来像:

entity_id | Date       | Value
1         | 2018-06-01 | 0.11111
1         | 2018-07-01 | null

例如,如果上一年值不存在,则显示空值
注意:我无法编辑该表。另外,原始表中有许多实体,每个实体都有如上所述的值。原来的table也很大。
我尝试了一些方法,比如这里提到的建议使用滞后函数的方法

select date, value, prev_value,
       (value - prev_value) / prev_value as YOY_growth
from (select t.*,
             lag(value) over (partition by right(date, 2)
                              order by left(date, 4)
                             ) as prev_value
      from t
     ) t
where prev_value is not null

但它不能解决丢失条目的情况。在评论中,人们建议问一个新问题。
另外,一种方法是使用连接查询,

select t1.*, t1.value as prev_value
from data_table as t1 left join data_table on t1.date = t2.date - INTERVAL '1 year'

但我不想使用它,因为这是一个结果表。所以,计算同一个表两次会变慢。
有更好的选择吗?

wn9m85ua

wn9m85ua1#

您可以使用 generate_series() ,然后使用窗口函数:

select date, (value - lag_value) / lag_value as yoy
from (
    select
        d.date,
        t.value,
        lag(t.value) over (partition by right(d.date, 2) order by left(d.date, 4)) as lag_value
    from (
        select to_char(
            generate_series((min(date) || '-01')::date, (max(date) || '-01')::date, interval '1 month'),
            'yyyy-mm'
        ) as date
        from mytable
    ) d
    left join mytable t on t.date = d.date
) t

相关问题