SQL:如何从不使用函数的表中获取上一个日期

问题描述 投票:1回答:2

我有一个名为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
sql postgresql view
2个回答
1
投票

这看起来像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的先前价格有所不同。请注意,根据您的数据,这可能不是前一天的价格(例如,如果您在日期系列中有滞后)。


0
投票

您可以使用自联接和不存在来执行此操作。

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
    )
© www.soinside.com 2019 - 2024. All rights reserved.