如何解决SQL 比较运算符问题) ...在第 1 行附近使用'>'2021-06-01' AND 100*(d1_close-close)/close>'29'' 的正确语法")
我正在尝试通过 python 文件运行 SQL 查询,但收到错误消息
... right syntax to use near '>'2021-06-01' AND 100*(d1_close-close)/close>'29'' at line 1")
我的查询代码如下:
sql = "WITH comparing_price AS (SELECT CODE,DATE,OPEN,high,low,close,volume,"\
"LEAD(OPEN,1) OVER (PARTITION BY CODE ORDER BY DATE) AS 'd1_open',2) OVER (PARTITION BY CODE ORDER BY DATE) AS 'd2_open',3) OVER (PARTITION BY CODE ORDER BY DATE) AS 'd3_open',"\
"LEAD(high,1) OVER (PARTITION BY CODE ORDER BY DATE) AS 'd1_high',2) OVER (PARTITION BY CODE ORDER BY DATE) AS 'd2_high',3) OVER (PARTITION BY CODE ORDER BY DATE) AS 'd3_high',4) OVER (PARTITION BY CODE ORDER BY DATE) AS 'd4_high',"\
"LEAD(low,1) OVER (PARTITION BY CODE ORDER BY DATE) AS 'd1_low',2) OVER (PARTITION BY CODE ORDER BY DATE) AS 'd2_low',3) OVER (PARTITION BY CODE ORDER BY DATE) AS 'd3_low',"\
"LEAD(close,1) OVER (PARTITION BY CODE ORDER BY DATE) AS 'd1_close',2) OVER (PARTITION BY CODE ORDER BY DATE) AS 'd2_close',3) OVER (PARTITION BY CODE ORDER BY DATE) AS 'd3_close',"\
"LEAD(volume,1) OVER (PARTITION BY CODE ORDER BY DATE) AS 'd1_volume',2) OVER (PARTITION BY CODE ORDER BY DATE) AS 'd2_volume',"\
"AVG(close) OVER (PARTITION BY CODE ORDER BY DATE,DATE ROWS BETWEEN 2 preceding AND 2 following) AS 'd2_MA5',DATE ROWS BETWEEN 7 preceding AND 2 following) AS 'd2_MA10',DATE ROWS BETWEEN 17 preceding AND 2 following) AS 'd2_MA20',DATE ROWS BETWEEN 57 preceding AND 2 following) AS 'd2_MA60',DATE ROWS BETWEEN 117 preceding AND 2 following) AS 'd2_MA120',"\
"STD(close) OVER (PARTITION BY CODE ORDER BY DATE,DATE ROWS BETWEEN 17 preceding AND 2 following) AS 'd2_std'"\
"FROM daily_price)"\
"SELECT * "\
"FROM comparing_price"\
"WHERE DATE>\'2021-06-01\' AND 100*(d1_close-close)/close>\'29\'"
curs.execute(sql)
我也尝试过如下不同的版本:
conditions=('2021-06-01','29')
...
....
"WHERE DATE>%s AND 100*(d1_close-close)/close>%s"
curs.execute(sql,conditions)
UPDATE)) 我认为语法错误在比较运算符中。如何将比较运算符从 python 发送到 SQL?
解决方法
三重引号允许您在不连接字符串的情况下编写查询,因为字符串可以跨越多行:
sql = """WITH comparing_price AS (SELECT CODE,DATE,OPEN,high,low,close,volume,LEAD(OPEN,1) OVER (PARTITION BY CODE ORDER BY DATE) AS 'd1_open',2) OVER (PARTITION BY CODE ORDER BY DATE) AS 'd2_open',3) OVER (PARTITION BY CODE ORDER BY DATE) AS 'd3_open',"LEAD(high,1) OVER (PARTITION BY CODE ORDER BY DATE) AS 'd1_high',LEAD(high,2) OVER (PARTITION BY CODE ORDER BY DATE) AS 'd2_high',3) OVER (PARTITION BY CODE ORDER BY DATE) AS 'd3_high',4) OVER (PARTITION BY CODE ORDER BY DATE) AS 'd4_high',LEAD(low,1) OVER (PARTITION BY CODE ORDER BY DATE) AS 'd1_low',2) OVER (PARTITION BY CODE ORDER BY DATE) AS 'd2_low',3) OVER (PARTITION BY CODE ORDER BY DATE) AS 'd3_low',LEAD(close,1) OVER (PARTITION BY CODE ORDER BY DATE) AS 'd1_close',2) OVER (PARTITION BY CODE ORDER BY DATE) AS 'd2_close',"\
LEAD(close,3) OVER (PARTITION BY CODE ORDER BY DATE) AS 'd3_close',LEAD(volume,1) OVER (PARTITION BY CODE ORDER BY DATE) AS 'd1_volume',2) OVER (PARTITION BY CODE ORDER BY DATE) AS 'd2_volume',AVG(close) OVER (PARTITION BY CODE ORDER BY DATE,DATE ROWS BETWEEN 2 preceding AND 2 following) AS 'd2_MA5',DATE ROWS BETWEEN 7 preceding AND 2 following) AS 'd2_MA10',DATE ROWS BETWEEN 17 preceding AND 2 following) AS 'd2_MA20',DATE ROWS BETWEEN 57 preceding AND 2 following) AS 'd2_MA60',DATE ROWS BETWEEN 117 preceding AND 2 following) AS 'd2_MA120',STD(close) OVER (PARTITION BY CODE ORDER BY DATE,DATE ROWS BETWEEN 17 preceding AND 2 following) AS 'd2_std'
FROM daily_price)
SELECT *
FROM comparing_price
WHERE DATE > '2021-06-01' AND 100*(d1_close-close)/close"""
这也使测试更容易,因为您只需将查询复制到另一个工具即可运行。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。