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