Запрос записей с параметрами в зависимости от предыдущих дат - PullRequest
3 голосов
/ 14 июля 2011

Моя таблица имеет вид:

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 Ответ

5 голосов
/ 14 июля 2011
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 и т. Д.), Я не ожидал бы, что ее функциональность будет самой современной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...