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

时间:2011-07-14 08:31:18

标签: 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

那么,我该如何形成一个查询呢?通常,您可以将其视为在先前记录中具有参数的查询。

Soham

1 个答案:

答案 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等相比),我不希望看到前沿功能。