Sql 查询参数取决于以前日期的记录
我的表格格式如下:Sql 查询参数取决于以前日期的记录,sql,ms-access,Sql,Ms Access,我的表格格式如下: 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 那么,我如何用这个来形成一个查询呢?通常,您可以将其视为一个查询,其参数位于以前的记录上 苏哈姆 编辑注释以详细说明三个连接的使用 像SAS这样的系统作为显式循环运行,在这里,您可以根据从以前循环的迭代中获得的值或结果
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
那么,我如何用这个来形成一个查询呢?通常,您可以将其视为一个查询,其参数位于以前的记录上
苏哈姆
编辑注释以详细说明三个连接的使用
像SAS这样的系统作为显式循环运行,在这里,您可以根据从以前循环的迭代中获得的值或结果进行计算
然而,SQL被表示为集合而不是循环,然后优化者估计实现该逻辑的算法效率最高的方法。然而,这种基于集合的表达式传统上意味着不能说“三条记录之前”,因为集合没有明确的顺序,或者它的处理顺序(并行性可能意味着它在chuncks中处理,索引可能意味着它在不同的顺序中处理,等等)
这意味着您需要一种基于集合的机制来获取要比较的记录。在这种情况下,如果您想比较“今天”和“昨天”,那么在比较之前,每个“今天”和“昨天”都是一个集合。您总共有4个不同的日期,因此需要将4个不同的集合合并在一起进行比较。从严格意义上讲,这就是关系数据库基于集合的表达式的工作原理
然而,ANSI-SQL现在确实包含了窗口函数,例如LAG,它允许根据您的需要使用基于集合的表示法。由于各种原因,它尚未得到广泛实施。由于ACCESS是一个轻量级数据库(与MySQL、SQL Server、Oracle等相比),我不希望它具有前沿功能。D-1、D-2等支持什么?其中
(关闭2天前的值)大于(关闭3天前的值)
和(关闭1天前的值)大于(2天前关闭的值)
尽管您有一个Id列,但我们是否能够假设每个日期只有一条记录?此外,Id值是否与日期相关?(昨天的Id总是比今天的Id少一条?)@Dems否id是非唯一编号,这里唯一唯一唯一唯一的是您可以说的特定id的日期。也就是说,对于特定id,日期是唯一的。无论如何,您只需处理日期。我不知道,如果我回答了您的问题,那么当我查找(D-1)、(D-2)和(D-3)时,我还应该确保ID值相同?该死,我不敢相信,我必须为此做一个内部连接。我认为这是一个非常简单的查询。选择那些日期,其中Close 2 days back>Close 3 days back和Close 1 day back>Close 2 days back。通常,its,选择那些日期,其中Close在过去2天内持续上升。H这有多难?@soham:note补充解释说“这正是SQL的工作原理,这是一种新的思维定势,你必须要习惯”,但用一种不那么轻率的方式:)非常感谢,但我不太确定,代码给出了一个错误:它说,第7行缺少运算符。@soham:尝试编辑。我刚刚更明确地说明了如何减去天数,并从表别名中删除了-
字符。Access的Jet SQL要求使用括号对内部联接操作进行显式排序。
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