SQL部门 - 年增长率

时间:2017-09-17 17:38:14

标签: sql postgresql

我有一个名为y_tgtcomp的表,由17列组成。

如下图所示,每行反映一个季度值(一年中有四个季度)。第一列列出了季度(下图),但随着时间的推移,这会更新,最新的季度始终位于底部(按1 asc排序)。

我正在尝试为除第一列以外的所有列选择年度增长率。这要求每个值回顾4个季度(qtr5 / qtr1-1)并在查询回顾时停止并找不到值/ null。每列的产出将是同比增长率,按1分为单位。

enter image description here

2 个答案:

答案 0 :(得分:0)

我相信你会搜索类似的内容:

WITH cte AS (
    SELECT LEFT(qrts, 2) AS year,
           COALESCE(SUM(y), 0) AS y,
           COALESCE(SUM(c1372),0) AS c1372, -- ...
    FROM y_tgtcomp
    GROUP BY LEFT(qrts,2)
)
SELECT year, y/NULLIF((LAG(y) OVER(ORDER BY year)),0) AS y_growth, ...
FROM cte
ORDER BY year ASC;

答案 1 :(得分:0)

这应该按照你的描述创建输出:

select
    qtrs,
    case when lag(y, 4, null) over(order by qtrs) <> 0
        then cast(y as double precision) /lag(y, 4, null) over(order by qtrs) - 1 
        else null
        end as y_yoy,
    case when lag(c5244, 4, null) over(order by qtrs) <> 0
        then c5244/lag(c5244, 4, null) over(order by qtrs) - 1 
        else null
        end as c5344_yoy
    -- Add similar case statements for other columns.
from
    y_tgtcomp
    ;

考虑规范化您的表格,以便您的列标题(yc5244等)是新列的值(category?)。

这个简单的用例并不是必需的,但如果您需要使用四分之一进行更复杂的计算而不是仅仅滞后于固定值,您可能会发现为季度创建自定义复合数据类型很有用。我在http://splinterofthesingularity.blogspot.com/2016/11/a-year-and-quarter-data-type-for.html发布了一些代码。