Oracle
 sql >> база данни >  >> RDS >> Oracle

Как да покажа записа с най-висока стойност в Oracle?

Понякога ORA-00907: missing right parenthesis означава точно това:имаме лява скоба без съответстваща дясна. Но може също да бъде предизвикано от синтактична грешка в част от израз, ограничен със скоби.

Това е втората причина тук:LIMIT е команда на Mysql, която Oracle не разпознава. Тук можете да използвате аналитична функция:

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

Това използва функцията RANK(), която ще върне повече от един ред, ако няколко изпълнители постигнат една и съща средна печалба. Вместо това може да искате да използвате ROW_NUMBER(). Аналитичните функции могат да бъдат много мощни. Научете повече .

Можете да приложите ROWN_NUMBER(), RANK() и DENSE_RANK() към всеки топn проблем. Можете да използвате един от тях, за да разрешите и първия си проблем.

Това вероятно е проблем с данните. Ако едно от числата в (salesPrice - AcquisitionPrice) е нула, резултатът ще бъде нулев и няма да бъде включен в средната стойност. Ако всички редове за даден изпълнител са null, AVG() ще бъде null.

Както се случва, редът на сортиране ще постави NULL последно. Но тъй като клаузата PARTITION BY сортира по AvgProfit desc което поставя резултатите NULL на ранг 1. Решението е да използвате NULLS LAST в клаузата за прозорци:

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

Това ще ви гарантира ненулев резултат в горната част (при условие, че поне един от вашите изпълнители има стойности и в двете колони).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Каква е алтернативата на Find_in_set на mysql в Oracle

  2. Инструмент за разработчици на Oracle SQL:Изтегляне и инсталиране

  3. конвейерна функция с параметър на курсора oracle

  4. Получаване на допълнителни редове - След присъединяване към 3-те маси с помощта на Left Join

  5. PL/SQL има ли еквивалентен StringTokenizer на Java?