查询具有参数的记录,具体取决于之前的日期

Soh*_*ham 3 sql ms-access

我的表格形式如下:

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

Mat*_*lie 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
Run Code Online (Sandbox Code Playgroud)

编辑注意详细说明三个连接的使用.

像SAS这样的系统作为显式循环运行,您可以根据循环的先前迭代获得的值或结果进行计算.

但是,SQL表示为集而不是循环,然后优化器估计实现该逻辑的最具算法效率的方法.然而,这个基于集合的表达式传统上意味着你不能说"三个记录之前",因为集合没有明确的顺序,或处理它的顺序(并行可能意味着它在chuncks中处理,索引可能意味着它以不同的顺序等处理,等等.

这意味着您需要一个基于集合的机制来获取要比较的记录.在这种情况下,如果您想将"今天"与"昨天"进行比较,那么每个都是在比较之前连接在一起的一组.您总共有4个不同的日子,所以有4个不同的组合在一起进行比较.从严格意义上讲,这就是关系数据库基于集合的表达式的工作原理......

但是,ANSI-SQL现在包括窗口函数,例如LAG,它允许基于集合的符号表示您想要的内容.由于各种原因,它尚未得到广泛实施.由于ACCESS是一个轻量级数据库(与MySQL,SQL Server,Oracle等相比),我不希望有前沿功能.