【问题标题】:PostgresSQL - Calculating Year Over Year Growth with data having missing entriesPostgresQL - 使用缺少条目的数据计算年同比增长
【发布时间】: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


【解决方案1】:

您可以使用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

【讨论】:

  • 知道了。但是桌子很大。它有多个实体,每个实体都有像 data_table 中的值。所以查询会太慢。
  • @arman:这不应该比初始查询慢。可以调整查询以考虑多个实体 - 但您应该在提出问题时首先提到这一点,并显示相应的数据。
  • 我同意了。我在问题中错过了这一点。对此表示歉意。已更新问题。
  • 我已正确更新问题。您现在能帮忙解决如何在查询中合并多个实体吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-15
  • 1970-01-01
  • 2023-01-14
  • 1970-01-01
  • 1970-01-01
  • 2015-04-04
相关资源
最近更新 更多