Manchmal ORA-00907: missing right parenthesis
bedeutet genau das:Wir haben eine linke Klammer ohne passende rechte. Es kann aber auch durch einen Syntaxfehler in einem durch Klammern begrenzten Teil einer Anweisung ausgelöst werden.
Es ist die zweite Ursache hier:LIMIT ist ein Mysql-Befehl, den Oracle nicht erkennt. Hier können Sie eine Analysefunktion verwenden:
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
Dabei wird die Funktion RANK() verwendet, die mehr als eine Zeile zurückgibt, wenn mehrere Künstler den gleichen Durchschnittsgewinn erzielen. Vielleicht möchten Sie stattdessen ROW_NUMBER() verwenden. Analytische Funktionen können sehr leistungsfähig sein. Weitere Informationen .
Sie können ROWN_NUMBER(), RANK() und DENSE_RANK() auf alle Top-n anwenden Problem. Sie können eines davon auch verwenden, um Ihr erstes Problem zu lösen.
Das ist wahrscheinlich ein Datenproblem. Wenn eine der Zahlen in (salesPrice - AcquisitionPrice)
null ist, ist das Ergebnis null und wird nicht in den Durchschnitt aufgenommen. Wenn alle Zeilen für einen Künstler null sind, ist AVG() null.
Wie es passiert, wird die Sortierreihenfolge NULL an letzter Stelle setzen. Aber da die PARTITION BY-Klausel nach AvgProfit desc
sortiert das bringt die NULL-Ergebnisse auf Rang 1. Die Lösung besteht darin, NULLS LAST in der Windowing-Klausel zu verwenden:
, rank() over (order by avgProfit desc nulls last) as rnk
Dies garantiert Ihnen oben ein Nicht-Null-Ergebnis (vorausgesetzt, mindestens einer Ihrer Künstler hat Werte in beiden Spalten).