首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >查询参数依赖于以前日期的记录

查询参数依赖于以前日期的记录
EN

Stack Overflow用户
提问于 2011-07-14 16:31:18
回答 1查看 143关注 0票数 3

我的表格形式如下:

代码语言:javascript
复制
Id, Date, Open,High,Low,Close,VOlume,OI

我正在使用MS Access,我需要像这样查询:

代码语言:javascript
复制
Select those dates(D), where Close on D-2> D-3 and D-1>D-2

那么,我该如何使用这个来形成一个查询呢?通常,您可以将其视为一个查询,其参数在以前的记录上。

索汉姆

EN

回答 1

Stack Overflow用户

发布于 2011-07-14 16:44:35

代码语言:javascript
复制
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被表示为集合而不是循环,然后优化器估计完成该逻辑的最高效的算法方法。然而,这个基于集合的表达式传统上意味着你不能说“三个记录之前”,因为集合没有明确的顺序,或者它被处理的顺序(并行性可能意味着它是分块处理的,索引可能意味着它是以不同的顺序处理的,等等)。

这意味着你需要一个基于集合的机制来获取你想要比较的记录。在这种情况下,如果你想比较“今天”和“昨天”,它们中的每一个都是你在比较之前连接在一起的集合。你总共有4个不同的日子,所以4个不同的集合可以结合在一起进行比较。在严酷的意义上,这就是关系数据库的基于集合的表达式的工作方式……

但是,ANSI-SQL现在确实包含了窗口函数,例如LAG,它允许您使用基于集合的符号来表示您需要的内容。由于各种原因,它还没有被广泛实施。由于ACCESS是一个轻量级的数据库(与MySQL、SQL Server、Oracle等相比),我并不期望它具有先进的功能。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6690460

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档