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

Hvordan viser man posten med den højeste værdi i Oracle?

Nogle gange ORA-00907: missing right parenthesis betyder præcis det:vi har en venstre beslag uden en matchende højre. Men det kan også forårsages af en syntaksfejl i en del af en sætning afgrænset af parenteser.

Det er den anden årsag her:LIMIT er en Mysql-kommando, som Oracle ikke genkender. Du kan bruge en analytisk funktion her:

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

Dette bruger RANK()-funktionen, som vil returnere mere end én række, hvis flere kunstnere opnår den samme gennemsnitlige fortjeneste. Du vil måske bruge ROW_NUMBER() i stedet. Analytiske funktioner kan være meget kraftfulde. Få mere at vide .

Du kan anvende ROWN_NUMBER(), RANK() og DENSE_RANK() til enhver top-n problem. Du kan også bruge en af ​​dem til at løse dit første problem.

Det er nok et dataproblem. Hvis et af tallene i (salesPrice - AcquisitionPrice) er null, vil resultatet være null og vil ikke blive inkluderet i gennemsnittet. Hvis alle rækkerne for en kunstner er null, vil AVG() være null.

Som det sker, vil sorteringsrækkefølgen sætte NULL sidst. Men da PARTITION BY-sætningen sorterer efter AvgProfit desc der placerer NULL-resultaterne i rang 1. Løsningen er at bruge NULLS LAST i vinduesklausulen:

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

Dette vil garantere dig et ikke-nul resultat øverst (forudsat at mindst én af dine kunstnere har værdier i begge kolonner).



  1. Er kopiering af mappen /var/lib/mysql et godt alternativ til mysqldump?

  2. Oracle-udløser for at oprette et autonummer

  3. Hvorfor ændrer DBI implicit heltal til strenge?

  4. mysql cross join, men uden duplikeret par?