【问题标题】:How to use sql LAG() properly如何正确使用 sql LAG()
【发布时间】:2019-07-03 07:33:33
【问题描述】:

我的以下 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

【问题讨论】:

  • 以表格格式提供样本数据和您的预期输出

标签: sql postgresql lag


【解决方案1】:

您需要使用子查询。您不能在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;

【讨论】:

  • 我在尝试时收到以下错误:SQL 错误 [42601]:错误:FROM 中的子查询必须有别名提示:例如,FROM (SELECT ...) [AS]富。位置:16 错误:FROM 中的子查询必须有别名提示:例如,FROM (SELECT ...) [AS] foo。位置:16 错误:FROM 中的子查询必须有别名提示:例如,FROM (SELECT ...) [AS] foo。职位:16
【解决方案2】:

lag(close) 表示“与先前记录的关闭值”。所以这个短语本身缺少一些基本的东西,特别是你如何定义“先前记录”,因为在 RDBMS 中从来没有任何隐含的顺序。

rankrow_number 等函数一样,要正确形成leadlag 命令,您需要通过定义输出顺序来建立前一个(或下一个)记录。换句话说,“如果您要按 x 对输出进行排序,则先前的记录关闭”将如下所示:

lag (close) over (order by x)

按降序排列:

lag (close) over (order by x desc)

您可以选择使用partition by 将数据按字段分块,这可能对您的问题有用,也可能没用。例如,“对于每个项目,如果您要按 x 对输出进行排序,则先前的记录关闭:”

lag (close) over (partition by item order by x)

这里的问题是先前的记录(滞后)......如何?按哪些字段,按什么顺序?

作为最后的想法,分析/窗口函数不能在 PostgreSQL 的where 子句中使用。为此,请将它们包装在子查询中:

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

【讨论】:

    猜你喜欢
    • 2021-11-22
    • 1970-01-01
    • 2021-10-11
    • 2013-04-16
    • 2013-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多