Sql ORA-00904无效标识符错误Teradata

Sql ORA-00904无效标识符错误Teradata,sql,group-by,aggregate-functions,having,ora-00904,Sql,Group By,Aggregate Functions,Having,Ora 00904,我在识别代码中的错误时遇到了问题,该错误是在我向代码中添加聚合函数后发生的。每个submitterclaimnumber项都有多行,seqnumber列下的每个行的值都在增加 我试图为每个特定的提交者claimNumber提取具有最高seqnumber的行 比如说。我有一个多行的submitterclaimnumber999。在seqnumber 因此,我: submitterclaimnumber=999seqnumber=1 submitterclaimnumber=999seqnumber

我在识别代码中的错误时遇到了问题,该错误是在我向代码中添加聚合函数后发生的。每个
submitterclaimnumber
项都有多行,
seqnumber
列下的每个行的值都在增加

我试图为每个特定的
提交者claimNumber
提取具有最高
seqnumber
的行

比如说。我有一个多行的
submitterclaimnumber
999。在
seqnumber
因此,我:
submitterclaimnumber
=999
seqnumber
=1
submitterclaimnumber
=999
seqnumber
=2
submitterclaimnumber
=999
seqnumber
=3

我只想显示
submitterclaimnumber
=999
seqnumber
=3

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

我得到的错误是:

“选择失败。904:ORA-00904:“最大顺序”:无效标识符”

  • 不能在查询中使用别名,必须在
    HAVING
    子句中使用
    MAX(CR.SEQNUMBER)

  • 您不能在
    HAVING

  • :


    您可能正在使用Teradata的SQL Assistant来查询Oracle系统,但您没有针对Teradata DBMS使用它:-)

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

    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 
    ;
    
    顺便说一句,在TeradataSQL中,您可以删除派生表,只需使用QUALIFY。然后它看起来非常接近您的原始语法:

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

    那是非常简单的。非常感谢。返回的选择失败。979:ORA-00979:不是GROUP BY表达式错误。这是因为我必须在group by语句中使用字段本身的名称吗?@JoeX您应该删除
    group by
    中的
    5
    ,您不能使用
    MAX()
    函数进行分组;)好的,我继续并删除了它,尝试了上面的代码,但还是得到了相同的错误。@JoeX发现:
    拥有CR.SEQNUMBER=MAX(CR.SEQNUMBER)
    你不能这样做,因为这里的
    SEQNUMBER
    在组内和组外。我会搜索一下,因为我不确定最好的解决方案。我会编辑我的answer@JoeX为什么要使用
    have
    ?仅仅是分组是不够的。为什么在Teradata中出现Oracle错误?如果您实际上在Oracle中运行此功能,请注意Oracle不支持序数值来代替
    GROUP BY
    ..@Bernie中的列标识符。我的查询本身在Teradata上运行,但我相信我正在连接Oracle DB。DB在Teradata的“我的资源管理器”窗格中显示为PRICRMP(Oracle)。您的代码中缺少右括号错误。我一直在尝试合并你在这里所做的,但我不明白括号在哪里丢失了。可能是Teradata没有在
    SELECT
    语句中识别
    OVER
    。@JoeX:有一个输入错误:应该是
    OVER(按
    分区),可能是这导致了错误(尽管我希望有更具体的错误消息)这就是我寻找括号而不是拼写检查所得到的结果=/我运行了它,但它工作正常。非常感谢!!!
    
    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 
    ;
    
    QUALIFY
       CR.SEQNUMBER
       = MAX(CR.SEQNUMBER) OVER (PARTITON BY CLM.SUBMITTERCLAIMNUMBER)