【问题标题】:Efficiently getting previous value with SQL使用 SQL 有效地获取先前的值
【发布时间】:2017-10-27 06:07:39
【问题描述】:

由于我正在处理一个相当大的数据集,因此我正在寻找一种更有效的方法来根据日期序列获取先前的值。我目前正在为每个值使用 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) 如何将 TodaysPrice 和 PrevPrice 之间的价格差异直接包含在 SQL 代码中?

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

【问题讨论】:

  • PrevDate 总是比 TodaysDate 早一个月吗?
  • 否 - 不幸的是,日期中没有模式。 PrevDate 是对象在表中列出的上一个日期(即如果它在周末,则前一天将是上周五)

标签: sql ms-access ms-access-2010


【解决方案1】:

你可以使用子查询

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

【讨论】:

  • 感谢您的意见!您提供的代码无法按原样运行,但我会尝试找出原因
  • 为子查询的对象字段添加别名,例如SELECT TDate AS TodaysDate, Object AS TodayObject, Price AS TodaysPrice, ...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多