Как правильно использовать sql LAG () - PullRequest
0 голосов
/ 09 февраля 2019

У меня есть следующая строка SQL с синтаксической ошибкой.Я пытаюсь сослаться на закрытие предыдущего дня в своем запросе SQL.

Спасибо!

SELECT *
FROM "daily_data"
WHERE date >'2018-01-01' and (open-LAG(close))/LAG(close)>=1.4 and volume > 1000000 and open > 1 

Ошибка:

Ошибка выполнения запроса Причина: ошибка SQL [42809]: ОШИБКА: задержка оконной функции требует предложения OVER Позиция:63

Ответы [ 2 ]

0 голосов
/ 09 февраля 2019

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
0 голосов
/ 09 февраля 2019

Вам нужно использовать подзапрос.Вы не можете использовать оконные функции в предложении where.Вам также понадобится ORDER BY и потенциально PARTITION BY предложение:

SELECT *
FROM (SELECT dd.*,
             LAG(close) OVER (ORDER BY date) as prev_close
      FROM "daily_data" dd
     ) dd
WHERE date > '2018-01-01' AND
      (open - prev_close) / prev_close >= 1.4 AND
      volume > 1000000 AND
      open > 1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...