首页 > 解决方案 > 尝试使用 LAG 计算行之间的百分比变化

问题描述

我正在尝试计算前几行之间的百分比变化。理想的目标是按日期获取变量的最新数据marketcap,后跟代表每行一天的 LIMIT。

如果有更好的方法来使用带有时间窗口的 LAG 函数,那可能会更好?

这是我的查询:

SELECT symbol, 
       date,
       marketcap,
       marketcap - 100.0 * (LAG(marketcap) OVER (ORDER BY date DESC) / marketcap) AS percent_change
FROM api.security_stats
WHERE symbol in ('AAPL','TSLA') 
LIMIT 254;

我无法获得行之间的百分比差异。我查看了其他堆栈溢出并尝试创建类似的函数,但我永远无法获得行之间的百分比差异。

我该如何解决上面的查询呢?

编辑:样本数据:

symbol |    date    |   marketcap
--------+------------+---------------
 AAPL   | 2020-09-29 | 1978012557000
 AAPL   | 2020-09-30 | 2007832713000
 AAPL   | 2020-10-01 | 2024823267000
 AAPL   | 2020-10-02 | 1959461646000
 AAPL   | 2020-10-05 | 2019795450000
 AAPL   | 2020-10-06 | 1961888868000
 AAPL   | 2020-10-07 | 1995176484000
 AAPL   | 2020-10-08 | 1993269381000
 AAPL   | 2020-10-09 | 2027943981000
 AAPL   | 2020-10-12 | 2156760120000
 AAPL   | 2020-10-13 | 2099547030000
 AAPL   | 2020-10-14 | 2101107387000
 AAPL   | 2020-10-15 | 2092785483000
 AAPL   | 2020-10-16 | 2063485446000
 AAPL   | 2020-10-19 | 2010780054000
 AAPL   | 2020-10-20 | 2037306123000
 AAPL   | 2020-10-21 | 2026210251000
 AAPL   | 2020-10-22 | 2006792475000
 AAPL   | 2020-10-23 | 1994482992000
 AAPL   | 2020-10-26 | 1994656365000
 AAPL   | 2020-10-27 | 2021529180000
 AAPL   | 2020-10-28 | 1927907760000
 AAPL   | 2020-10-29 | 1999337436000
 AAPL   | 2020-10-30 | 1887338478000
 AAPL   | 2020-11-02 | 1849285786000
 AAPL   | 2020-11-03 | 1877678792000

标签: sqlpostgresql

解决方案


大概,您想要每个符号的计算。如果是这样:

SELECT symbol, date, marketcap,
       (marketcap - LAG(marketcap) OVER (PARTITION BY symbol ORDER BY date)) * 100.0 / marketcap AS percent_change
FROM api.security_stats
WHERE symbol in ('AAPL','TSLA') 
LIMIT 254;

我也调整了计算。

请注意,LAG()通常不与ORDER BY DESC. 如果您想要下一行,请使用LEAD().


推荐阅读