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
=999seqnumber
=1
submitterclaimnumber
=999seqnumber
=2
submitterclaimnumber
=999seqnumber
=3
我只想显示submitterclaimnumber
=999seqnumber
=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)