Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Como exibir o registro com o maior valor no Oracle?


Às vezes ORA-00907: missing right parenthesis significa exatamente isso:temos um colchete esquerdo sem um colchete direito correspondente. Mas também pode ser gerado por um erro de sintaxe em uma parte de uma instrução delimitada por parênteses.

É essa segunda causa aqui:LIMIT é um comando do Mysql que o Oracle não reconhece. Você pode usar uma função analítica aqui:
SELECT A1.artistid, A1.firstname, TEMP1.avgProfit
FROM 
(
    select  artistid
            , avgProfit
            , rank() over (order by avgProfit desc) as rnk
    from (
        SELECT 
            AVG(salesPrice - AcquisitionPrice) as avgProfit, 
            W1.artistid as artistid
        FROM dtoohey.trans T1
        INNER JOIN dtoohey.WORK W1
        ON W1.workid = T1.workid
        GROUP BY artistid
    ) 
) TEMP1
INNER JOIN dtoohey.artist A1
    ON A1.artisid = TEMP1.artistid
where TEMP1.rnk = 1

Isso usa a função RANK() que retornará mais de uma linha se vários artistas atingirem o mesmo lucro médio. Você pode querer usar ROW_NUMBER() em vez disso. As funções analíticas podem ser muito poderosas. Saiba mais .

Você pode aplicar ROWN_NUMBER(), RANK() e DENSE_RANK() a qualquer top-n problema. Você pode usar um deles para resolver seu primeiro problema também.

Isso é provavelmente um problema de dados. Se um dos números em (salesPrice - AcquisitionPrice) for nulo o resultado será nulo e não será incluído na média. Se todas as linhas de um artista forem nulas, o AVG() será nulo.

Quando isso acontecer, a ordem de classificação colocará NULL por último. Mas como a cláusula PARTITION BY classifica por AvgProfit desc que coloca os resultados NULL na classificação 1. A solução é usar o NULLS LAST na cláusula de janela:
            , rank() over (order by avgProfit desc nulls last) as rnk

Isso garantirá um resultado não nulo no topo (desde que pelo menos um de seus artistas tenha valores em ambas as colunas).