如何使用 BETWEEN 运算符比较两个 SELECT 子查询?
How to compare two SELECT subqueries by using the BETWEEN operator?
我正在使用 Oracle Database 12c 企业版。
table 看起来像这样:http://i.stack.imgur.com/gL2L6.jpg
table显示不同股票的股价,分别有不同的ID(WKN)、起始价(Start)、最高价(Hoch)、最低价(Tief)和收盘价(Schluss) 每天按日期 (Datum)。我现在想直接在 SQL 中计算一条 90 天的线。计算方式为90天内每一天的收盘价均取过去90天收盘价的算术平均值。
我试着用下面的 SQL 语句来计算:
SELECT SUM(SCHLUSSPREIS) / 90 AS TAGESLINIE FROM KURS WHERE DATUM BETWEEN
(SELECT DATUM FROM KURS WHERE WKN = 2 AND DATUM BETWEEN
(SELECT MAX(DATUM) - 179 FROM KURS) AND
(SELECT MAX(DATUM) - 90 FROM KURS) ORDER BY DATUM ASC)
AND (SELECT DATUM FROM KURS WHERE WKN = 2 AND DATUM BETWEEN
(SELECT MAX(DATUM) - 89 FROM KURS) AND
(SELECT MAX(DATUM) FROM KURS) ORDER BY DATUM ASC)
;
为了让您更好地了解这个令人困惑的陈述,我创建了以下方案:http://i.stack.imgur.com/XjYXf.jpg
两者,第一个子查询...
(SELECT DATUM FROM KURS WHERE WKN = 2 AND DATUM BETWEEN
(SELECT MAX(DATUM) - 179 FROM KURS) AND
(SELECT MAX(DATUM) - 90 FROM KURS) ORDER BY DATUM ASC)
...和第二个子查询...
(SELECT DATUM FROM KURS WHERE WKN = 2 AND DATUM BETWEEN
(SELECT MAX(DATUM) - 89 FROM KURS) AND
(SELECT MAX(DATUM) FROM KURS) ORDER BY DATUM ASC)
...做 return 相同数量的日期列表 (90)。
第一个子查询列表中的第一个日期属于第二个子查询列表中的第一个日期,第一个子查询列表中的第二个日期属于第二个子查询列表中的第二个日期, 等等 (comp. scheme obove).我现在希望我的 SQL 语句总结每个期间(从第一个日期(列表 1)到第一个日期(列表 2)等)之间的所有收盘价并将其除以 90 以获得算术平均值, 直到两个列表都为空。
但是,如果我 运行 这样做,我会收到以下错误消息:
ERROR at line 1:
ORA-00907: missing right parenthesis
或
ERROR at line 1:
ORA-01427: single row subquery returns more than one row
知道如何在 SQL 中直接做这样的事情吗?
感谢任何帮助 - 谢谢! :-)
SUM
不是 SQL 中唯一可用的聚合函数。
在这里你可能想使用 AVG
代替:
SELECT *
FROM (
SELECT
DATUM,
AVG(SCHLUSSPREIS) OVER (ORDER BY DATUM rows BETWEEN 89 PRECEDING AND CURRENT ROW) AS TAGESLINIE
FROM KURS
WHERE WKN = 2
ORDER BY DATUM DESC
) Moving_Average
WHERE ROWNUM <= 90;
我正在使用 Oracle Database 12c 企业版。
table 看起来像这样:http://i.stack.imgur.com/gL2L6.jpg
table显示不同股票的股价,分别有不同的ID(WKN)、起始价(Start)、最高价(Hoch)、最低价(Tief)和收盘价(Schluss) 每天按日期 (Datum)。我现在想直接在 SQL 中计算一条 90 天的线。计算方式为90天内每一天的收盘价均取过去90天收盘价的算术平均值。
我试着用下面的 SQL 语句来计算:
SELECT SUM(SCHLUSSPREIS) / 90 AS TAGESLINIE FROM KURS WHERE DATUM BETWEEN
(SELECT DATUM FROM KURS WHERE WKN = 2 AND DATUM BETWEEN
(SELECT MAX(DATUM) - 179 FROM KURS) AND
(SELECT MAX(DATUM) - 90 FROM KURS) ORDER BY DATUM ASC)
AND (SELECT DATUM FROM KURS WHERE WKN = 2 AND DATUM BETWEEN
(SELECT MAX(DATUM) - 89 FROM KURS) AND
(SELECT MAX(DATUM) FROM KURS) ORDER BY DATUM ASC)
;
为了让您更好地了解这个令人困惑的陈述,我创建了以下方案:http://i.stack.imgur.com/XjYXf.jpg
两者,第一个子查询...
(SELECT DATUM FROM KURS WHERE WKN = 2 AND DATUM BETWEEN
(SELECT MAX(DATUM) - 179 FROM KURS) AND
(SELECT MAX(DATUM) - 90 FROM KURS) ORDER BY DATUM ASC)
...和第二个子查询...
(SELECT DATUM FROM KURS WHERE WKN = 2 AND DATUM BETWEEN
(SELECT MAX(DATUM) - 89 FROM KURS) AND
(SELECT MAX(DATUM) FROM KURS) ORDER BY DATUM ASC)
...做 return 相同数量的日期列表 (90)。
第一个子查询列表中的第一个日期属于第二个子查询列表中的第一个日期,第一个子查询列表中的第二个日期属于第二个子查询列表中的第二个日期, 等等 (comp. scheme obove).我现在希望我的 SQL 语句总结每个期间(从第一个日期(列表 1)到第一个日期(列表 2)等)之间的所有收盘价并将其除以 90 以获得算术平均值, 直到两个列表都为空。
但是,如果我 运行 这样做,我会收到以下错误消息:
ERROR at line 1:
ORA-00907: missing right parenthesis
或
ERROR at line 1:
ORA-01427: single row subquery returns more than one row
知道如何在 SQL 中直接做这样的事情吗?
感谢任何帮助 - 谢谢! :-)
SUM
不是 SQL 中唯一可用的聚合函数。
在这里你可能想使用 AVG
代替:
SELECT *
FROM (
SELECT
DATUM,
AVG(SCHLUSSPREIS) OVER (ORDER BY DATUM rows BETWEEN 89 PRECEDING AND CURRENT ROW) AS TAGESLINIE
FROM KURS
WHERE WKN = 2
ORDER BY DATUM DESC
) Moving_Average
WHERE ROWNUM <= 90;