使用 SQL 有效地获取先前的值

Efficiently getting previous value with SQL

因为我正在处理一个相当大的数据集,所以我正在寻找一种更有效的方法来根据日期序列获取以前的值。我目前正在为每个值使用 SELECT TOP 1 子查询,但是每次我 运行 查询

都会花费很多时间

示例数据:

TDate       Object    Price     Volume
18.05.2017  ObjectA     105      10
18.05.2017  ObjectB     110      10
18.05.2017  ObjectC     120      10
19.05.2017  ObjectA     100      12
19.05.2017  ObjectB     75       10
19.05.2017  ObjectD     33       10
22.05.2017  ObjectA     105      15
22.05.2017  ObjectB     80       10
22.05.2017  ObjectD     55       10

我的代码:

SELECT  TDate AS TodaysDate, Object, Price AS TodaysPrice, Volume AS   TodaysVolume,
( SELECT TOP 1 TDate
                              FROM Table1 AS P2
                              WHERE P2.Object = Table1.Object
                                AND P2.TDate < Table1.TDate
                              ORDER BY P2.TDate DESC ) As prevDate,
( SELECT TOP 1 Price
                              FROM Table1 AS P2
                              WHERE P2.Object = Table1.Object
                                AND P2.TDate < Table1.TDate
                              ORDER BY P2.TDate DESC ) As prevPrice,
( SELECT TOP 1 Volume
                              FROM Table1 AS P2
                              WHERE P2.Object = Table1.Object
                                AND P2.TDate < Table1.TDate
                              ORDER BY P2.TDate DESC ) As PrevVolume
FROM Table1

输出:

TodaysDate  Object  TodaysPrice TodaysVolume    prevDate    prevPrice   PrevVolume
18.05.2017  ObjectA     105     10          
18.05.2017  ObjectB     110     10          
18.05.2017  ObjectC     120     10          
19.05.2017  ObjectA     100     12              18.05.2017      105     10
19.05.2017  ObjectB     75      10              18.05.2017      110     10
19.05.2017  ObjectD     33      10          
22.05.2017  ObjectA     105     15              19.05.2017      100     12
22.05.2017  ObjectB     80      10              19.05.2017      75      10
22.05.2017  ObjectD     55      10              19.05.2017      33      10

输出是正确的,但我非常感谢在两件事上的投入;

1) 有什么方法可以更有效地计算以前的日期和值吗? (我使用的是 Microsoft Access 2010)

2) 如何在 SQL 代码中直接合并 TodaysPrice 和 PrevPrice 之间的价格差异?

提前感谢您的任何建议和意见!

可以使用子查询

SELECT   TodaysDate, TodaysObject, TodaysPrice, TodaysVolume, Today.PrevDate,
    prev.Price  as PrevPrice, prev.Volume as PrevVolume
FROM (
    SELECT  TDate AS TodaysDate, Object as TodaysObject, Price AS TodaysPrice, Volume AS   TodaysVolume,
        Table1.Object, ( SELECT MAX(P2.TDate)
                              FROM Table1 AS P2
                              WHERE P2.Object = Table1.Object
                                AND P2.TDate < Table1.TDate ) As PrevDate
    FROM Table1) Today
    LEFT JOIN Table1 as Prev ON Today.TodaysObject= Prev.Object AND Today.PrevDate = Prev.TDate