Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Wie wird der Datensatz mit dem höchsten Wert in Oracle angezeigt?

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).