Ibland ORA-00907: missing right parenthesis
betyder precis det:vi har en vänster parentes utan en matchande höger. Men det kan också orsakas av ett syntaxfel i en del av en sats som begränsas av parenteser.
Det är den andra orsaken här:LIMIT är ett Mysql-kommando som Oracle inte känner igen. Du kan använda en analytisk funktion här:
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
Detta använder funktionen RANK() som kommer att returnera mer än en rad om flera artister uppnår samma genomsnittliga vinst. Du kanske vill använda ROW_NUMBER() istället. Analytiska funktioner kan vara mycket kraftfulla. Läs mer .
Du kan använda ROWN_NUMBER(), RANK() och DENSE_RANK() på valfri topp-n problem. Du kan också använda en av dem för att lösa ditt första problem.
Det är förmodligen ett dataproblem. Om ett av siffrorna i (salesPrice - AcquisitionPrice)
är null blir resultatet null och kommer inte att inkluderas i genomsnittet. Om alla rader för en artist är null kommer AVG() att vara null.
När det händer kommer sorteringsordningen att sätta NULL sist. Men eftersom PARTITION BY-satsen sorteras efter AvgProfit desc
som sätter NULL-resultaten i rang 1. Lösningen är att använda NULLS LAST i windowing-satsen:
, rank() over (order by avgProfit desc nulls last) as rnk
Detta kommer att garantera dig ett resultat som inte är noll i toppen (förutsatt att minst en av dina artister har värden i båda kolumnerna).