我有一个表,有每月的数据,有几个月的缺失条目,形式如下:
数据表
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'
但我不想使用它,因为这是一个结果表。所以,计算同一个表两次会变慢。
有更好的选择吗?
1条答案
按热度按时间wn9m85ua1#
您可以使用
generate_series()
,然后使用窗口函数: