【发布时间】:2020-10-31 09:34:37
【问题描述】:
我有一个包含月度数据的表格,其中缺少几个月的条目,格式为:
数据表
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
即。如果上一年的值不存在,则显示为空
注意:我无法编辑表格。此外,原始表有很多实体,每个实体都有上面的值。原来的表也很大。
我尝试了几种方法,例如提到的here,它建议使用像这样的滞后函数
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
但它并不能解决丢失条目的情况。在 cmets 中,人们建议提出一个新问题。
另外,一种方法是使用连接查询,
select t1.*, t1.value as prev_value
from data_table as t1 left join data_table on t1.date = t2.date - INTERVAL '1 year'
但我不想使用它,因为这是一个结果表。因此,两次计算同一张表会变慢。
还有更好的选择吗?
【问题讨论】:
-
您是否真的将日期存储为
yyyy-mm格式的字符串,或者您实际上使用的是date数据类型?
标签: sql postgresql date window-functions