sql >> Databáze >  >> RDS >> Oracle

Jak zobrazit záznam s nejvyšší hodnotou v Oracle?

Někdy ORA-00907: missing right parenthesis znamená přesně to:máme levou závorku bez odpovídající pravé. Může to ale také způsobit syntaktická chyba v části příkazu ohraničené závorkami.

Zde je druhá příčina:LIMIT je příkaz Mysql, který Oracle nerozpozná. Zde můžete použít analytickou funkci:

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

To používá funkci RANK(), která vrátí více než jeden řádek, pokud několik umělců dosáhne stejného průměrného zisku. Možná budete chtít místo toho použít ROW_NUMBER(). Analytické funkce mohou být velmi výkonné. Další informace .

ROWN_NUMBER(), RANK() a DENSE_RANK() můžete použít na jakýkoli top-n problém. Jeden z nich můžete také použít k vyřešení svého prvního problému.

To je asi problém s daty. Pokud je jedno z čísel v (salesPrice - AcquisitionPrice) je null, výsledek bude null a nebude zahrnut do průměru. Pokud jsou všechny řádky pro interpreta null, AVG() bude null.

Jak se to stane, pořadí řazení umístí NULL jako poslední. Ale protože klauzule PARTITION BY řadí podle AvgProfit desc což dává výsledky NULL na 1. pozici. Řešením je použít NULLS LAST v klauzuli pro vytváření oken:

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

To vám zaručí nenulový výsledek nahoře (za předpokladu, že alespoň jeden z vašich umělců má hodnoty v obou sloupcích).



  1. Vložte obrázek do databáze pomocí php

  2. Návrat z Open World 2013

  3. Třídění podstromu v hierarchické datové struktuře uzavírací tabulky

  4. Uložená procedura Oracle:vrátí sadu výsledků i parametry out