在 Snowflake SQL 中计算通货膨胀率

Calculate Inflation rates in Snowflake SQL

提问人:ffi23 提问时间:2/24/2023 最后编辑:ffi23 更新时间:2/24/2023 访问量:125

问:

在 snowflake SQL 中,我有一个包含通货膨胀因子的表格,年复一年,如下所示:

通货膨胀
2000 1.1 %
2001 1.3 %
2002 -1.3 %
2003 2.3 %

我想制作一个表格,列出每年从2000年为基准年的总通货膨胀率

谢谢!

这里有一个古老的、类似的问题,但我不知道如何适应它

更新***

我尝试了建议的解决方案,但它不起作用:

test

sql snowflake-cloud-data-platform

评论


答:

1赞 Junjie 2/24/2023 #1

您可以使用 SQL 窗口函数和一些算术技巧来做到这一点。简而言之,结合 SUM()、LOG() 和 EXP() 函数来获得您想要的结果。

这个想法背后的算术技巧是 A X B = EXP(LOG(EXP(1),A)+LOG(EXP(1),B))

我们使用基于窗口的 sum() 函数来计算截至 X 年的累积对数(通货膨胀率)值,然后应用 exp() 来获得原始累积通货膨胀率。

请参阅以下代码作为示例(在 snowflake sql 语法中,在代码中使用特定于 snowflake 的 ln() 函数):

select 
   record_year, 
   inflation_rate, 
   round(exp(SUM(ln(1+inflation_rate)) OVER (ORDER BY record_year)) -1,3)  as cum_inflation_rate
FROM inflation_data

已验证的运行示例 SQLFIDDLE 链接

输出示例:

record_year inflation_rate cum_inflation_rate
2000 0.011 0.011
2001 0.013 0.024
2002 -0.013 0.011
2003 0.023 0.034

评论

0赞 ffi23 2/24/2023
谢谢你@Junjie,但出于某种原因,您的代码产生了巨大的结果:第一年,速率为 0.014,结果是 1,009,521,342,720,310,000,000,000,000,000,000
0赞 Junjie 2/24/2023
嗨,@ffi23,您可以查看我的 VERIFIED SQL FIDDLE LINK 以查看您提供的数据的运行示例。在没有提供进一步信息的情况下,我可以对问题的来源进行一些猜测。1. 您的数据存储格式是 0.014 还是 1.4?2. 您是否以每年一行的格式存储数据?还是每年多行?3. 为什么数据从 1960 年开始,听起来像是将 null 值转换为 datetime 格式并返回最早的时间 (1960-xx-xxx)?
0赞 Junjie 2/24/2023
嗨,@ffi23,我发现了这个问题。在 snowflake log() 函数中,参数顺序 (base, expr) 与大多数其他数据库参数顺序 (expr, base) 不同。我将答案中的查询更新为雪花 log() 函数格式,即 .log(exp(1),1+inflation_rate)。再试一次。
0赞 Lukasz Szozda 2/24/2023
@Junjie 更简单的方法是只使用 LN
0赞 Junjie 2/24/2023
嗨,@LukaszSzozda,没错。我使用 log() 以防有人想在其他数据库中使用该逻辑。在此用例中,更新查询以使用 ln() 而不是 log(exp(1),)。