sql >> Database >  >> RDS >> Oracle

Hoe het record met de hoogste waarde in Oracle weer te geven?

Soms ORA-00907: missing right parenthesis betekent precies dat:we hebben een linkerbeugel zonder een bijpassende rechter. Maar het kan ook worden veroorzaakt door een syntaxisfout in een deel van een instructie dat wordt begrensd door haakjes.

Het is die tweede oorzaak hier:LIMIT is een Mysql-commando dat Oracle niet herkent. U kunt hier een analytische functie gebruiken:

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

Dit gebruikt de functie RANK() die meer dan één rij teruggeeft als meerdere artiesten dezelfde gemiddelde winst behalen. Misschien wilt u in plaats daarvan ROW_NUMBER() gebruiken. Analytische functies kunnen zeer krachtig zijn. Meer informatie .

U kunt ROWN_NUMBER(), RANK() en DENSE_RANK() toepassen op elke top-n probleem. Je kunt er ook een gebruiken om je eerste probleem op te lossen.

Dat is waarschijnlijk een dataprobleem. Als een van de cijfers in (salesPrice - AcquisitionPrice) is null het resultaat is null en wordt niet meegerekend in het gemiddelde. Als alle rijen voor een artiest null zijn, is de AVG() null.

Toevallig zal de sorteervolgorde NULL als laatste plaatsen. Maar aangezien de clausule PARTITION BY sorteert op AvgProfit desc die de NULL-resultaten op rang 1 plaatst. De oplossing is om de NULLS LAST in de vensterclausule te gebruiken:

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

Dit garandeert u een niet-null-resultaat bovenaan (op voorwaarde dat ten minste één van uw artiesten waarden in beide kolommen heeft).



  1. Een database maken in SQL Server

  2. ORA-28860:Fatale SSL-fout bij gebruik van UTL_HTTP?

  3. mysql_install_db, fout:35, op een Mac OS X 10.9.1

  4. Alleen de eerste rij uit een ResultSet halen