À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).