Oracle - 缺少此函数的窗口规范

时间:2017-10-12 15:23:11

标签: oracle group-by

我继承了一个oracle数据库并且习惯了MySQL我正在努力获取我需要的数据。

我正试图从TTDINV700732和TTCCOM001732获取记录,其中TTDINV700732中的最大(日期)是一年前的GTEQ,并且在联合表TTDINV150732中有记录,其中日期是今天的GTEQ。

我收到错误

[99999][30484] ORA-30484: missing window specification for this function

这是我的SQL

  SELECT

  first_value(trim("TTDINV700732"."T$ITEM")) AS "item",
  first_value("TTDINV700732"."T$CWAR") AS "whse",
  max("TTDINV700732"."T$TRDT") AS "date",
  first_value("TTCCOM001732"."T$NAMB") AS "business"

  FROM "DB"."TTDINV700732" "TTDINV700732"


  LEFT OUTER JOIN "DB"."TTIITM001732" "TTIITM001732" ON "TTDINV700732"."T$ITEM"="TTIITM001732"."T$ITEM"
  LEFT OUTER JOIN "DB"."TTCCOM001732" "TTCCOM001732" ON "TTIITM001732"."T$CPLB"="TTCCOM001732"."T$EMNO"
  LEFT OUTER JOIN "DB"."TTDINV150732" "TTDINV150732" ON "TTDINV150732"."T$ITEM"="TTDINV700732"."T$ITEM"


  where "TTDINV700732"."T$TRDT" <= to_date('12 Oct 2016', 'DD MON YYYY')
  and "TTDINV700732"."T$QUAN" < 0
  and "TTDINV150732"."T$DATE" >= to_date('12 Oct 2017','DD MON YYYY')

  group by "TTDINV700732"."T$ITEM", "TTDINV700732"."T$CWAR"

1 个答案:

答案 0 :(得分:0)

  1. 其中TTDINV700732的最大(日期)是一年前的GTEQ (从今天开始)
  2. 如果您为<= to_date('12 Oct 2016', 'DD MON YYYY')过滤该表,那么没有最大值可能大于您指定的日期,那是故意/正确吗?或者,您是否需要子查询来获取MAX()日期然后使用HAVING MAX(T$TRDT) <= to_date('12 Oct 2016', 'DD MON YYYY') ??

    1. ...加入了TTDINV150732表,其日期是GTEQ今天
    2. 这应该等于今天,还是等于 ??

      这样的事情会起作用吗?

      SELECT
               t700732.t$item AS item 
             , t700732.t$cwar AS whse 
             , t700732.mx_date AS mx_date
             , ttccom001732.t$namb AS business 
      FROM (
          SELECT ttdinv700732.t$item  , ttdinv700732.t$cwar, MAX(ttdinv700732.t$trdt) mx_date
          FROM   db.ttdinv700732 
          WHERE  ttdinv700732.t$quan < 0 
          GROUP  BY ttdinv700732.t$item  , ttdinv700732.t$cwar 
          HAVING MAX(ttdinv700732.t$trdt) <= To_date('12 Oct 2016', 'DD MON YYYY') 
          ) t700732
      INNER JOIN db.ttdinv150732 ON t700732.t$item = ttdinv150732.t$item
      LEFT OUTER JOIN db.ttiitm001732 ON ttdinv700732.t$item = ttiitm001732.t$item 
      LEFT OUTER JOIN db.ttccom001732 ON ttiitm001732.t$cplb = ttccom001732.t$emno 
      where ttdinv150732.t$date >= To_date('12 Oct 2017', 'DD MON YYYY') 
      

      您可能会发现更容易解决它,就像它是MySQL而不是尝试您不熟悉的Oracle功能。