ORA-00904 Ошибка неверного идентификатора Teradata

У меня возникли проблемы с определением ошибки в моем коде, которая произошла после того, как я добавил к нему агрегатную функцию. Каждый из submitterclaimnumber элементов имеет несколько строк, каждая с увеличивающимися значениями в столбце seqnumber.

Я пытаюсь вытащить строку с самым высоким seqnumber для каждого конкретного submitterclaimnumber.

Например. У меня submitterclaimnumber 999 с несколькими строками. Каждая строка отличается другим значением в seqnumber, поэтому у меня есть: submitterclaimnumber = 999 seqnumber = 1 submitterclaimnumber = 999 seqnumber = 2 submitterclaimnumber = 999 seqnumber = 3

Я хочу, чтобы отображалось только submitterclaimnumber = 999 seqnumber = 3.

При необходимости я могу предоставить немного больше информации о том, как настраивается стол.

Я получаю следующую ошибку:

«Ошибка выбора. 904: ORA-00904:« MAX_SEQ »: недопустимый идентификатор»

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 
; 

person JoeX    schedule 09.03.2018    source источник
comment
Гм. Почему вы получаете ошибку Oracle в Teradata? Если вы действительно запускаете это в Oracle, имейте в виду, что Oracle не поддерживает порядковые значения вместо идентификаторов столбцов в _1 _...   -  person mechanical_meat    schedule 10.03.2018
comment
@Bernie, мой запрос работает на Teradata, но я считаю, что подключаюсь к базе данных Oracle. База данных отображается как PRICRMP (Oracle) на моей панели Explorer в Teradata.   -  person JoeX    schedule 10.03.2018


Ответы (2)


Вы можете использовать Teradata SQL Assistant для запроса своей системы Oracle, но вы не используете его против СУБД Teradata :-)

Чтобы получить строку с максимальным SEQNUMBER на SUBMITTERCLAIMNUMBER, вы не можете использовать 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 вы можете удалить производную таблицу и просто использовать QUALIFY. Тогда он выглядит довольно близко к вашему исходному синтаксису:

QUALIFY
   CR.SEQNUMBER
   = MAX(CR.SEQNUMBER) OVER (PARTITON BY CLM.SUBMITTERCLAIMNUMBER) 
person dnoeth    schedule 09.03.2018
comment
Я получаю ошибку в коде из-за отсутствия правой круглой скобки. Я пытался включить здесь то, что вы сделали, но не понимаю, где отсутствует скобка. Может быть, Teradata не распознает OVER в заявлении SELECT? - person JoeX; 10.03.2018
comment
@JoeX: Опечатка: должно быть OVER (PARTITION BY, возможно, это вызывает ошибку (хотя я бы ожидал более конкретного сообщения об ошибке) - person dnoeth; 10.03.2018
comment
Вот что я получаю, ища скобки вместо проверки орфографии = / Я запустил его, но он сработал. Большое, большое спасибо !!! - person JoeX; 12.03.2018

  1. Вы не можете использовать псевдоним внутри запроса, вы должны использовать MAX(CR.SEQNUMBER) в своем предложении HAVING

  2. нельзя сравнивать неагрегатную строку типа CR.SEQNUMBER внутри HAVING

:

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
; 
person Blag    schedule 09.03.2018
comment
Что ж, это было до боли просто. Спасибо. Это вернуло SELECT Failed. 979: ORA-00979: не ошибка выражения GROUP BY. Это потому, что я должен использовать имена самих полей в моей группе по выражению? - person JoeX; 10.03.2018
comment
@JoeX, вы должны удалить 5 в group by, вы не будете группировать по функции MAX();) - person Blag; 10.03.2018
comment
Хорошо, я удалил его, попробовал ваш код выше и получил ту же ошибку. - person JoeX; 10.03.2018
comment
@JoeX обнаружил: HAVING CR.SEQNUMBER = MAX(CR.SEQNUMBER) вы не можете этого сделать, поскольку SEQNUMBER здесь находится внутри и за пределами группы. Я немного поищу, так как не уверен в лучшем решении. Я отредактирую свой ответ - person Blag; 10.03.2018
comment
@JoeX, почему ты используешь HAVING? просто GROUP BY мало? - person Blag; 10.03.2018
comment
Спасибо. По какой-то конкретной причине, почему мы не можем использовать HAVING CR.SEQNUMBER = MAX(CR.SEQNUMBER)? - person JoeX; 10.03.2018
comment
Я использовал HAVING, чтобы в результатах отображались только строки с максимальным CR.SEQNUMBER. Просто чтобы проверить это, я удалил HAVING CR.SEQNUMBER = MAX(CR.SEQNUMBER) и получил ... ошибку выражения GROUP BY. - person JoeX; 10.03.2018
comment
@JoeX, вы не можете его использовать, потому что HAVING запускается после GROUP BY, что означает, что у вас больше нет CR.SEQNUMBER. Имея снова используется жестко закодированное значение, например having count(id) > 1 или агрегатное значение having sum(input)> sum(output) - person Blag; 10.03.2018
comment
@JoeX, хорошо, тот факт, что удаление having not remove the error, является удивительным (и не лучшим), не могли бы вы сделать небольшой sqlfiddle.com? как этот, который отображается до того, как sqlfiddle.com/#!4/3b8bc/8 - person Blag; 10.03.2018
comment
@JoeX хорошо, вы не можете использовать числа с оракулом, поэтому XD - person Blag; 10.03.2018
comment
Я не слежу. Я не могу использовать числовые значения, влияет на группу по утверждению? Мне все еще нужно, чтобы я создал sqlfiddle.com с данными? - person JoeX; 10.03.2018
comment
@JoeX Положите sqlfiddle в режим ожидания, вопрос в том, что именно вы хотите в качестве вывода? Я не получаю ваш only the rows with the maximum CR.SEQNUMBER would show in the results, не могли бы вы объяснить / отредактировать свой вопрос, чтобы привести пример? - person Blag; 10.03.2018
comment
Хорошо, я отредактировал свой вопрос выше, добавив немного дополнительной информации о результатах, которые я пытаюсь получить. - person JoeX; 10.03.2018
comment
@JoeX, если вы используете столбцы в группе только по, то не нужно иметь. - person Blag; 10.03.2018
comment
Я запустил его, используя только Group By и столбцы из вашего кода под Group By. Он вернул все CR.SEQNUMBER, а не только предполагаемые максимальные значения. знак равно - person JoeX; 10.03.2018
comment
@JoeX ты хочешь максимума от чего? первая из всех, или первая, не знаю что? - person Blag; 12.03.2018
comment
Допустим, у меня есть 4 записи. 2 записи относятся к п. 123, остальные 2 - к п. Abc. В п. 123 есть две записи, одна с порядковым номером 1, а другая с порядковым номером 2. В п. Abc также есть две записи, одна с порядковым номером 2, а другая с порядковым номером 3. Я бы хотел, чтобы только п. 123 и abc имели наивысший порядковый номер. - person JoeX; 12.03.2018