Oracle
 sql >> Database >  >> RDS >> Oracle

Come visualizzare il record con il valore più alto in Oracle?

A volte ORA-00907: missing right parenthesis significa esattamente questo:abbiamo una parentesi sinistra senza una destra corrispondente. Ma può anche essere generato da un errore di sintassi in una parte di un'istruzione delimitata da parentesi.

È la seconda causa qui:LIMIT è un comando Mysql che Oracle non riconosce. Puoi usare una funzione analitica qui:

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

Questo utilizza la funzione RANK() che restituirà più di una riga se più artisti ottengono lo stesso profitto medio. Potresti invece utilizzare ROW_NUMBER(). Le funzioni analitiche possono essere molto potenti. Scopri di più .

Puoi applicare ROWN_NUMBER(), RANK() e DENSE_RANK() a qualsiasi top-n problema. Puoi usarne uno anche per risolvere il tuo primo problema.

Probabilmente è un problema di dati. Se uno dei numeri in (salesPrice - AcquisitionPrice) è nullo il risultato sarà nullo e non sarà incluso nella media. Se tutte le righe per un artista sono nulle, AVG() sarà nullo.

Come succede, l'ordinamento metterà NULL per ultimo. Ma poiché la clausola PARTITION BY ordina per AvgProfit desc che mette i risultati NULL al rango 1. La soluzione è usare NULLS LAST nella clausola windowing:

            , rank() over (order by avgProfit desc nulls last) as rnk

Questo ti garantirà un risultato non nullo in alto (ammesso che almeno uno dei tuoi artisti abbia valori in entrambe le colonne).