我有一个名为Stocks的表,其中包含Date,StocksID和Price。该表包含2018年几种不同市场股票价格的数据。我想创建Stocks表格的视图,其中显示日期,StocksID,previous_price,price和change_in_price。 Previous_price表示前一天同一股票的价格。在没有使用任何内置函数的情况下获取previous_price时遇到问题。
我尝试通过从前一个日期获得价格获得previous_price,但我不知道如何获得上一个日期。
非常感谢任何帮助,谢谢!
示例输出:
Date | StocksID | prevprice | price | change
-----------+-----------+-----------+-------+--------
2012-01-04 | 1 | 0.91 | 0.92 | 0.01
2012-01-05 | 1 | 0.92 | 0.91 | -0.01
2012-01-06 | 1 | 0.91 | 0.90 | -0.01
2012-01-09 | 1 | 0.90 | 0.89 | -0.01
这看起来像Postgres window function LAG()
的一个很好的用例,从版本9.4开始提供:
SELECT
s.*,
LAG(price) OVER(PARTITION BY s.stocksID ORDER BY s.date) previous_price,
price - LAG(price) OVER(ORDER BY s.date) change
FROM Stocks s
这将使您与stocksID
订购的相同date
的先前价格有所不同。请注意,根据您的数据,这可能不是前一天的价格(例如,如果您在日期系列中有滞后)。
您可以使用自联接和不存在来执行此操作。
p1是当前的,p2是先前的
select p1.*, p2.*
from price p1
left join price p2 on p2.StocksID=p1.StocksID and p2.Date<p1.Date
and not exists(
select * from price p3
where p3.StocksID=p1.StocksID and p3.Date<p1.Date
and p3.Date>p2.date
)