如何使用BETWEEN运算符比较两个SELECT子查询?

时间:2016-06-07 21:31:42

标签: sql select subquery between oracle12c

我正在使用Oracle Database 12c企业版。

表格如下:http://i.stack.imgur.com/gL2L6.jpg

该表显示了不同股票的股票价格,它们的独特ID(WKN),它们的起始价格(开始),它们的最高价格(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中做这样的事情?

感谢任何帮助 - 谢谢! : - )

1 个答案:

答案 0 :(得分:1)

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;