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
;
您不能在查询中使用别名,您必须在 HAVING
子句中使用 MAX(CR.SEQNUMBER)
你不能在 HAVING
中比较像 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)
我无法识别代码中添加聚合函数后发生的错误。 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
;
您不能在查询中使用别名,您必须在
HAVING
子句中使用MAX(CR.SEQNUMBER)
你不能在
HAVING
中比较像
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)