ORA-00904 无效标识符错误 Teradata

ORA-00904 Invalid Identifier Error Teradata

我无法识别代码中添加聚合函数后发生的错误。 submitterclaimnumber 项中的每一项都有多行,每行在 seqnumber 列下都有递增的值。

我正在尝试为每个特定 submitterclaimnumber 拉出具有最高 seqnumber 的行。

例如。我有一个包含多行的 submitterclaimnumber 999。每行在 seqnumber 下由不同的值区分 所以我有: submitterclaimnumber = 999 seqnumber = 1 submitterclaimnumber = 999 seqnumber = 2 submitterclaimnumber = 999 seqnumber = 3

我只想显示 submitterclaimnumber = 999 seqnumber = 3。

如果需要,我可以提供更多关于如何设置 table 的信息。

我得到的错误是:

"SELECT Failed. 904: ORA-00904: "MAX_SEQ": invalid identifier"

SELECT
    CR.CLAIMNUMBER  
    ,CR.LINENUMBER  
    ,SUBSTR(CLM.SUBMITTERCLAIMNUMBER,3,11) AS CLM_NBR
    ,CR.SEQNUMBER   
    ,MAX(CR.SEQNUMBER) AS MAX_SEQ 
    ,CR.VOLUME  
    ,CR.VOLUMETYPE  
    ,CR.RATE    
    ,CR.RATETYPE    
    ,CR.ALLOWED     
FROM PRICER.CLMREPRICINGDETAIL CR   
INNER JOIN PRICER.CLMCLAIMS CLM 
    ON  CLM.CLAIMNUMBER = CR.CLAIMNUMBER    
INNER JOIN PRICER.CLMCLAIMITEMS CLMP 
    ON CLM.CLAIMNUMBER = CLMP.CLAIMNUMBER 
        AND CLM.OWNERID = CLMP.OWNERID   
INNER JOIN PRICER.CLMINSURED CLMI 
    ON CLM.CLAIMNUMBER = CLMI.CLAIMNUMBER 
        AND CLM.OWNERID = CLMI.OWNERID      
WHERE 
    TRADEPARTNERID IN ('NationalNonHouse','NationalHouse')
    AND SUBSTR(CLM.SUBMITTERCLAIMNUMBER,3,11) IN ('17304CD2083','17297CA4107')  
GROUP BY 1,2,3,4,5,6,7,8,9,10   
HAVING CR.SEQNUMBER =  MAX_SEQ 
; 
  1. 您不能在查询中使用别名,您必须在 HAVING 子句中使用 MAX(CR.SEQNUMBER)

  2. 你不能在 HAVING

  3. 中比较像 CR.SEQNUMBER 这样的非聚合行

:

SELECT
    CR.CLAIMNUMBER  
    ,CR.LINENUMBER  
    ,SUBSTR(CLM.SUBMITTERCLAIMNUMBER,3,11) AS CLM_NBR
    ,CR.SEQNUMBER   
    ,MAX(CR.SEQNUMBER) AS MAX_SEQ 
    ,CR.VOLUME  
    ,CR.VOLUMETYPE  
    ,CR.RATE    
    ,CR.RATETYPE    
    ,CR.ALLOWED     
FROM PRICER.CLMREPRICINGDETAIL CR   
INNER JOIN PRICER.CLMCLAIMS CLM 
    ON  CLM.CLAIMNUMBER = CR.CLAIMNUMBER    
INNER JOIN PRICER.CLMCLAIMITEMS CLMP 
    ON CLM.CLAIMNUMBER = CLMP.CLAIMNUMBER 
        AND CLM.OWNERID = CLMP.OWNERID   
INNER JOIN PRICER.CLMINSURED CLMI 
    ON CLM.CLAIMNUMBER = CLMI.CLAIMNUMBER 
        AND CLM.OWNERID = CLMI.OWNERID      
WHERE 
    TRADEPARTNERID IN ('NationalNonHouse','NationalHouse')
    AND SUBSTR(CLM.SUBMITTERCLAIMNUMBER,3,11) IN ('17304CD2083','17297CA4107')  
GROUP BY
     CR.CLAIMNUMBER
    ,CR.LINENUMBER
    ,SUBSTR(CLM.SUBMITTERCLAIMNUMBER,3,11)
    ,CR.SEQNUMBER
    ,CR.VOLUME
    ,CR.VOLUMETYPE
    ,CR.RATE
    ,CR.RATETYPE
    ,CR.ALLOWED
-- HAVING CR.SEQNUMBER =  MAX(CR.SEQNUMBER) -- not allowed
; 

您可能正在使用 Teradata 的 SQL Assistant 来查询您的 Oracle 系统,但您并未将其用于 Teradata DBMS :-)

要获取每个 SUBMITTERCLAIMNUMBER 具有最大 SEQNUMBER 的行,您不能使用 HAVING,因为聚合后没有更多单独的行可以比较。但是 Windowed Aggregate 允许:

SELECT *
FROM
 (
    SELECT
        CR.CLAIMNUMBER  
        ,CR.LINENUMBER  
        ,SUBSTR(CLM.SUBMITTERCLAIMNUMBER,3,11) AS CLM_NBR
        ,CR.SEQNUMBER   
        ,MAX(CR.SEQNUMBER) OVER (PARTITON BY SUBMITTERCLAIMNUMBER) AS MAX_SEQ 
        ,CR.VOLUME  
        ,CR.VOLUMETYPE  
        ,CR.RATE    
        ,CR.RATETYPE    
        ,CR.ALLOWED     
    FROM PRICER.CLMREPRICINGDETAIL CR   
    INNER JOIN PRICER.CLMCLAIMS CLM 
        ON  CLM.CLAIMNUMBER = CR.CLAIMNUMBER    
    INNER JOIN PRICER.CLMCLAIMITEMS CLMP 
        ON CLM.CLAIMNUMBER = CLMP.CLAIMNUMBER 
            AND CLM.OWNERID = CLMP.OWNERID   
    INNER JOIN PRICER.CLMINSURED CLMI 
        ON CLM.CLAIMNUMBER = CLMI.CLAIMNUMBER 
            AND CLM.OWNERID = CLMI.OWNERID      
    WHERE 
        TRADEPARTNERID IN ('NationalNonHouse','NationalHouse')
        AND SUBSTR(CLM.SUBMITTERCLAIMNUMBER,3,11) IN ('17304CD2083','17297CA4107')  
 -- no more GROUP BY
 ) dt
WHERE SEQNUMBER =  MAX_SEQ 
;

顺便说一句,在 Teradata SQL 中,您可以删除 Derived Table 并简单地使用 QUALIFY。然后它看起来非常接近您的原始语法:

QUALIFY
   CR.SEQNUMBER
   = MAX(CR.SEQNUMBER) OVER (PARTITON BY CLM.SUBMITTERCLAIMNUMBER)