提问人:ffi23 提问时间:2/24/2023 最后编辑:ffi23 更新时间:2/24/2023 访问量:125
在 Snowflake SQL 中计算通货膨胀率
Calculate Inflation rates in Snowflake SQL
问:
在 snowflake SQL 中,我有一个包含通货膨胀因子的表格,年复一年,如下所示:
年 | 通货膨胀 |
---|---|
2000 | 1.1 % |
2001 | 1.3 % |
2002 | -1.3 % |
2003 | 2.3 % |
我想制作一个表格,列出每年从2000年为基准年的总通货膨胀率
谢谢!
这里有一个古老的、类似的问题,但我不知道如何适应它
更新***
我尝试了建议的解决方案,但它不起作用:
答:
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
输出示例:
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),)。
评论