Oracle
 sql >> Base de données >  >> RDS >> Oracle

Comment afficher l'enregistrement avec la valeur la plus élevée dans Oracle ?

Parfois ORA-00907: missing right parenthesis signifie exactement cela :nous avons un crochet gauche sans crochet droit correspondant. Mais elle peut aussi être levée par une erreur de syntaxe dans une partie d'une instruction délimitée par des parenthèses.

C'est cette deuxième cause ici :LIMIT est une commande Mysql qu'Oracle ne reconnaît pas. Vous pouvez utiliser une fonction analytique ici :

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

Cela utilise la fonction RANK () qui renverra plus d'une ligne si plusieurs artistes réalisent le même profit moyen. Vous voudrez peut-être utiliser ROW_NUMBER() à la place. Les fonctions analytiques peuvent être très puissantes. En savoir plus .

Vous pouvez appliquer ROWN_NUMBER(), RANK() et DENSE_RANK() à n'importe quel top-n problème. Vous pouvez également utiliser l'un d'eux pour résoudre votre premier problème.

C'est probablement un problème de données. Si l'un des nombres dans (salesPrice - AcquisitionPrice) est nul, le résultat sera nul et ne sera pas inclus dans la moyenne. Si toutes les lignes d'un artiste sont nulles, AVG() sera nulle.

En l'occurrence, l'ordre de tri mettra NULL en dernier. Mais comme la clause PARTITION BY trie par AvgProfit desc qui place les résultats NULL au rang 1. La solution est d'utiliser le NULLS LAST dans la clause de fenêtrage :

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

Cela vous garantira un résultat non nul en haut (à condition qu'au moins un de vos artistes ait des valeurs dans les deux colonnes).