我的表格形式如下:
Id, Date, Open,High,Low,Close,VOlume,OI
Run Code Online (Sandbox Code Playgroud)
我正在使用MS Access,我需要像这样查询:
Select those dates(D), where Close on D-2> D-3 and D-1>D-2
Run Code Online (Sandbox Code Playgroud)
那么,我如何形成一个查询呢?通常,您可以将其视为在先前记录中具有其参数的查询.
Soham
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
Run Code Online (Sandbox Code Playgroud)
编辑注意详细说明三个连接的使用.
像SAS这样的系统作为显式循环运行,您可以根据循环的先前迭代获得的值或结果进行计算.
但是,SQL表示为集而不是循环,然后优化器估计实现该逻辑的最具算法效率的方法.然而,这个基于集合的表达式传统上意味着你不能说"三个记录之前",因为集合没有明确的顺序,或处理它的顺序(并行可能意味着它在chuncks中处理,索引可能意味着它以不同的顺序等处理,等等.
这意味着您需要一个基于集合的机制来获取要比较的记录.在这种情况下,如果您想将"今天"与"昨天"进行比较,那么每个都是在比较之前连接在一起的一组.您总共有4个不同的日子,所以有4个不同的组合在一起进行比较.从严格意义上讲,这就是关系数据库基于集合的表达式的工作原理......
但是,ANSI-SQL现在包括窗口函数,例如LAG,它允许基于集合的符号表示您想要的内容.由于各种原因,它尚未得到广泛实施.由于ACCESS是一个轻量级数据库(与MySQL,SQL Server,Oracle等相比),我不希望有前沿功能.