我的表格形式如下:
Id, Date, Open,High,Low,Close,VOlume,OI我正在使用MS Access,我需要像这样查询:
Select those dates(D), where Close on D-2> D-3 and D-1>D-2那么,我该如何使用这个来形成一个查询呢?通常,您可以将其视为一个查询,其参数在以前的记录上。
索汉姆
发布于 2011-07-14 16:44:35
SELECT
[Today].*
FROM
(
(
MyTable AS [Today]
INNER JOIN
MyTable AS [TodayMinus1]
ON [TodayMinus1].Date = DATEADD("d", -1, [Today].Date)
AND [TodayMinus1].ID = [Today].ID
)
INNER JOIN
MyTable AS [TodayMinus2]
ON [TodayMinus2].Date = DATEADD("d", -2, [Today].Date)
AND [TodayMinus2].ID = [Today].ID
)
INNER JOIN
MyTable AS [TodayMinus3]
ON [TodayMinus3].Date = DATEADD("d", -3, [Today].Date)
AND [TodayMinus3].ID = [Today].ID
WHERE
[TodayMinus1].Close > [TodayMinus2].Close
AND [TodayMinus2].Close > [TodayMinus3].Close编辑注释以详细说明三个连接的用法。
像SAS这样的系统是以显式循环的形式运行的,您可以根据循环的先前迭代获得的值或结果进行计算。
然而,SQL被表示为集合而不是循环,然后优化器估计完成该逻辑的最高效的算法方法。然而,这个基于集合的表达式传统上意味着你不能说“三个记录之前”,因为集合没有明确的顺序,或者它被处理的顺序(并行性可能意味着它是分块处理的,索引可能意味着它是以不同的顺序处理的,等等)。
这意味着你需要一个基于集合的机制来获取你想要比较的记录。在这种情况下,如果你想比较“今天”和“昨天”,它们中的每一个都是你在比较之前连接在一起的集合。你总共有4个不同的日子,所以4个不同的集合可以结合在一起进行比较。在严酷的意义上,这就是关系数据库的基于集合的表达式的工作方式……
但是,ANSI-SQL现在确实包含了窗口函数,例如LAG,它允许您使用基于集合的符号来表示您需要的内容。由于各种原因,它还没有被广泛实施。由于ACCESS是一个轻量级的数据库(与MySQL、SQL Server、Oracle等相比),我并不期望它具有先进的功能。
https://stackoverflow.com/questions/6690460
复制相似问题