sql >> Base de Datos >  >> RDS >> Oracle

¿Cómo mostrar el registro con el valor más alto en Oracle?

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