Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Jak wyświetlić rekord o najwyższej wartości w Oracle?

Czasami ORA-00907: missing right parenthesis oznacza dokładnie to:mamy lewy nawias bez pasującego prawego. Ale może to być również spowodowane błędem składni w części instrukcji ograniczonej nawiasami.

To ta druga przyczyna tutaj:LIMIT to polecenie Mysql, którego Oracle nie rozpoznaje. Tutaj możesz użyć funkcji analitycznej:

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

Wykorzystuje funkcję RANK(), która zwróci więcej niż jeden wiersz, jeśli kilku artystów osiągnie ten sam średni zysk. Możesz zamiast tego użyć ROW_NUMBER(). Funkcje analityczne mogą być bardzo potężne. Dowiedz się więcej .

Możesz zastosować ROWN_NUMBER(), RANK() i DENSE_RANK() do dowolnego n problem. Możesz użyć jednego z nich do rozwiązania pierwszego problemu.

To prawdopodobnie problem z danymi. Jeśli jedna z liczb w (salesPrice - AcquisitionPrice) jest null wynik będzie null i nie zostanie uwzględniony w średniej. Jeśli wszystkie wiersze artysty mają wartość null, funkcja AVG() będzie miała wartość null.

Tak się składa, że ​​kolejność sortowania ustawi NULL na końcu. Ale ponieważ klauzula PARTITION BY sortuje według AvgProfit desc która umieszcza wyniki NULL na pozycji 1. Rozwiązaniem jest użycie NULLS LAST w klauzuli okienkowej:

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

Zagwarantuje to wynik inny niż null na górze (pod warunkiem, że co najmniej jeden z Twoich wykonawców ma wartości w obu kolumnach).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Funkcja JSON_TABLE() w Oracle

  2. Wstaw do z CTE

  3. Jak przejść przez rozdzieloną listę w Oracle PLSQL?

  4. Poddźwiękowe wsparcie dla Oracle ODP.NET?

  5. Dapper - wywołaj Oracle schema.package.function