【发布时间】:2016-10-07 23:14:16
【问题描述】:
我正在使用 Oracle Database 12c 企业版。
表格如下所示:http://i.stack.imgur.com/gL2L6.jpg
该表显示了不同股票的股票价格,每天有不同的 ID (WKN)、起始价 (Start)、最高价 (Hoch)、最低价 (Tief) 和收盘价 (Schluss)日期(基准)。我现在想直接在 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)
...确实返回相同数量的日期列表 (90)。
第一个子查询列表中的第一个日期属于第二个子查询列表中的第一个日期,第一个子查询列表中的第二个日期属于第二个子查询列表中的第二个日期,以此类推.(上面的比较方案)。我现在希望我的 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 中执行类似的操作吗?
感谢您的帮助-谢谢! :-)
【问题讨论】:
-
您可以编写一个 SQL 函数来计算 90 天的平均值。它接受 WKN 和结束日期作为参数,并返回平均值。将此与主查询分开测试并使其正常工作。然后你从你的主 SQL 选择中调用这个函数。
-
我必须为大学做这个,我们不允许使用用户定义的 SQL 函数。我将尝试使用 join 和 coalesce() 函数来解决它。
标签: sql select subquery between oracle12c