在PostgreSQL上计算过去十二个月的收入

时间:2019-03-22 18:31:04

标签: sql postgresql

我有一个具有以下结构的表:

yyyymm Revenue
 ...    ...    
201701  450   
201701  600    
201702  350    
...     ...
201903   559

我希望查询以以下形式返回:

yyyymm  TTM Revenue
 201701   Sum of Revenue from 201601 to 201612
 201702   Sum of Revenue from 201602 to 201701
 ...      ...

我尝试使用:

select yyyymm, sum(case when ...) from table group by 1

但是我无法弄清楚逻辑和语法。有人可以帮我吗?

3 个答案:

答案 0 :(得分:0)

您需要累计金额:

select t.*,
       sum(revenue) over (order by yyyymm rows between 12 preceding and 1 preceding) as trailing_12_months_revenue
from t;

这需要连续12个月的数据 (按书面规定)。如果您缺少几个月,可以为此进行修改。

答案 1 :(得分:0)

我不知道这是否对您有帮助,但这将是Microsoft Sql Server的方法,减去等式的12个月部分,如果在T-Sql中需要一点点工作,该日期将以这种格式存储,以将其转换为日期,并在该日期上运行where。

CREATE TABLE #temp (yyyymm int, revenue int)

INSERT INTO #temp
(
    yyyymm,
    revenue
)
VALUES
(201701, 450), (201701, 600), (201702,350)

SELECT 
    yyyymm, 
    SUM(revenue) 
From #temp 
GROUP BY #temp.yyyymm 

DROP TABLE #temp

答案 2 :(得分:0)

最简单的方法是使用子选择(我称您的表foo):

select
    foo.*,
    (select sum(revenue) from
        foo ly
    where
        ly.yyyymm between foo.yyyymm - 100 and foo.yyyymm - 1
    ) as last_years_revenue
from foo;

这将产生以下结果:

输入:

 yyyymm | revenue
--------+---------
 201701 |     450
 201701 |     600
 201702 |     350
 201601 |      45
 201601 |      60
 201602 |      35


 yyyymm | revenue | last_years_revenue
--------+---------+--------------------
 201701 |     450 |                140
 201701 |     600 |                140
 201702 |     350 |               1085
 201601 |      45 |               NULL
 201601 |      60 |               NULL
 201602 |      35 |                105

2016年的收入为60 + 35 + 45 = 140。

2017-02的收入为450 + 600 + 35 = 1085。