lag(close)
означает «значение закрытия из предыдущей записи».Таким образом, в самой фразе отсутствует что-то фундаментальное, в частности, как вы определяете «предыдущую запись», поскольку в СУБД никогда не подразумевается никакого подразумеваемого порядка.
Как и в случае с такими функциями, как rank
и row_number
,Правильно сформируйте команды lead
и lag
, которые необходимо установить для предыдущей (или следующей) записи, определив порядок вывода.Другими словами, «если бы вы отсортировали вывод по x, закрытие предыдущей записи» выглядело бы так:
lag (close) over (order by x)
Чтобы упорядочить что-то по убыванию:
lag (close) over (order by x desc)
ВыПри желании можно разделить данные на части с помощью поля partition by
, что может или не может быть полезным в вашей проблеме.Например, «для каждого элемента, если вы должны были отсортировать выходные данные по x, предыдущая запись закрывается:По каким полям, в каком порядке?
В заключение, аналитические / оконные функции нельзя использовать в предложении where
в PostgreSQL.Для этого оберните их в подзапрос:
with daily as (
SELECT
d.*,
LAG (d.close) over (order by d.<something>) as prior_close
FROM "daily_data" d
WHERE
d.date >'2018-01-01' and
d.volume > 1000000 and
d.open > 1
)
select *
from daily
where
(open - prior_close) / prior_close >= 1.4