A veces ORA-00907: missing right parenthesis
significa exactamente eso:tenemos un paréntesis izquierdo sin un paréntesis derecho correspondiente. Pero también puede ser arrojado por un error de sintaxis en una parte de una declaración delimitada por paréntesis.
Es esa segunda causa aquí:LIMIT es un comando Mysql que Oracle no reconoce. Puede utilizar una función analítica aquí:
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
Esto usa la función RANK() que devolverá más de una fila si varios artistas logran la misma ganancia promedio. Es posible que desee utilizar ROW_NUMBER() en su lugar. Las funciones analíticas pueden ser muy poderosas. Más información .
Puede aplicar ROWN_NUMBER(), RANK() y DENSE_RANK() a cualquier top-n problema. También puedes usar uno de ellos para resolver tu primer problema.
Eso es probablemente un problema de datos. Si uno de los números en (salesPrice - AcquisitionPrice)
es nulo, el resultado será nulo y no se incluirá en el promedio. Si todas las filas de un artista son nulas, AVG() será nulo.
Da la casualidad de que el orden de clasificación pondrá NULL en último lugar. Pero como la cláusula PARTITION BY se ordena por AvgProfit desc
eso pone los resultados NULL en el rango 1. La solución es usar NULLS LAST en la cláusula de ventana:
, rank() over (order by avgProfit desc nulls last) as rnk
Esto le garantizará un resultado no nulo en la parte superior (siempre que al menos uno de sus artistas tenga valores en ambas columnas).