2017-10-12 326 views
0

我已经继承了一个Oracle数据库并用于MySQL,我正在努力获取我需要的数据。Oracle - 此功能缺少窗口规范

我想从TTDINV700732和TTCCOM001732中获取记录,其中TTDINV700732中的最大(日期)是一年前的GTEQ,而今天的日期是GTEQ的连接表TTDINV150732中有记录。

我得到的错误

[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" 
+0

在Oracle中'FIRST_VALUE'分析函数只能与一个窗口子句一起使用,例如'FIRST_VALUE OVER(按列逐列分列)'。示例请参阅:https://oracle-base.com/articles/misc/first-value-and-last-value-analytic-functions –

回答

0
  1. 其中最大(日)在TTDINV700732是GTEQ一年前(今天)

如果您过滤该表格为<= to_date('12 Oct 2016', 'DD MON YYYY'),那么最大值不能超过您指定的日期,那是故意的还是正确的?或者,是否需要子查询才能获得MAX()日期,然后使用HAVING MAX(T$TRDT) <= to_date('12 Oct 2016', 'DD MON YYYY')??

  • ...连接表TTDINV150732其中日期今天
  • GTEQ如果这是等于今天,或大于和等于??

    会这样的工作?

    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尚未熟悉的功能。