我的表格形式为:
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
那么,我该如何形成一个查询呢?通常,您可以将其视为在先前记录中具有参数的查询。
Soham
答案 0 :(得分:5)
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表示为集而不是循环,然后优化器估计实现该逻辑的最具算法效率的方法。然而,这个基于集合的表达式传统上意味着你不能说“三个记录之前”,因为集合没有明确的顺序,或处理它的顺序(并行可能意味着它在chuncks中处理,索引可能意味着它以不同的顺序等处理。)这意味着您需要一个基于集合的机制来获取要比较的记录。在这种情况下,如果您想将“今天”与“昨天”进行比较,那么每个都是在比较之前连接在一起的一组。您总共有4个不同的日子,所以有4个不同的组合在一起进行比较。在严格意义上,这就是关系数据库基于集合的表达式的工作原理......
然而,ANSI-SQL现在包括窗口函数,例如LAG,它允许基于集合的符号表示您想要的内容。由于各种原因,它尚未得到广泛实施。由于ACCESS是一个轻量级数据库(与MySQL,SQL Server,Oracle等相比),我不希望看到前沿功能。