Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 查询参数取决于以前日期的记录_Sql_Ms Access - Fatal编程技术网

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