使用SQL高效地获取以前的值
由于我正在处理一个相当大的数据集,因此我正在寻找一种更有效的方法,根据日期序列获取以前的值。我目前正在为每个值使用SELECT TOP 1子查询,但每次运行查询时都会花费大量时间 样本数据:使用SQL高效地获取以前的值,sql,ms-access,ms-access-2010,Sql,Ms Access,Ms Access 2010,由于我正在处理一个相当大的数据集,因此我正在寻找一种更有效的方法,根据日期序列获取以前的值。我目前正在为每个值使用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.2
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
输出是正确的,但我非常感谢在两件事上的输入
1有没有办法更有效地计算上一个日期和值?我正在使用Microsoft Access 2010
2如何将TodaysPrice和PrevPrice之间的价格差异直接合并到SQL代码中
提前感谢您的建议和意见 您可以使用子查询
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
PrevDate是否总是比今天早一个月?否-不幸的是,日期中没有模式。PrevDate是对象在表中列出的前一天,即,如果超过一个周末,前一天将是最后一个星期五谢谢您的输入!您提供的代码无法正常工作,但我将尝试找出为什么在子查询的对象字段中添加别名,例如,选择TDate作为TodaysDate,选择Object作为TodaySObject,选择Price作为TodaysPrice。。。
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