Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Bagaimana cara menampilkan catatan dengan nilai tertinggi di Oracle?

Terkadang ORA-00907: missing right parenthesis artinya persis seperti itu:kami memiliki braket kiri tanpa braket kanan yang cocok. Tapi itu juga bisa dilempar oleh kesalahan sintaks di bagian pernyataan yang dibatasi oleh tanda kurung.

Penyebab kedua di sini:LIMIT adalah perintah Mysql yang tidak dikenali Oracle. Anda dapat menggunakan fungsi analitik di sini:

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

Ini menggunakan fungsi RANK() yang akan mengembalikan lebih dari satu baris jika beberapa artis mencapai keuntungan rata-rata yang sama. Anda mungkin ingin menggunakan ROW_NUMBER() sebagai gantinya. Fungsi analitik bisa sangat kuat. Cari tahu lebih lanjut .

Anda dapat menerapkan ROWN_NUMBER(), RANK() dan DENSE_RANK() ke atas-n mana saja masalah. Anda dapat menggunakan salah satunya untuk menyelesaikan masalah pertama Anda juga.

Itu mungkin masalah data. Jika salah satu nomor di (salesPrice - AcquisitionPrice) adalah null hasilnya akan menjadi null, dan tidak akan dimasukkan dalam rata-rata. Jika semua baris untuk artis adalah nol, AVG() akan menjadi nol.

Ketika itu terjadi, urutan pengurutan akan membuat NULL menjadi yang terakhir. Tetapi karena klausa PARTITION BY mengurutkan berdasarkan AvgProfit desc yang menempatkan hasil NULL pada peringkat 1. Solusinya adalah dengan menggunakan NULLS LAST pada klausa windowing:

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

Ini akan menjamin Anda hasil non-null di bagian atas (asalkan setidaknya satu artis Anda memiliki nilai di kedua kolom).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tambal tabel riwayat di Oracle Apps (11i/R12.1/R12.2)

  2. Oracle Stored Procedure inout parameter masalah - Mendapat solusinya - Kesalahan ketik

  3. mengecilkan database di oracle 11g

  4. Bagaimana cara melewatkan nilai di blok anonim dengan parameter tabel plsql

  5. Dalam kluster Oracle akankah sysdate selalu mengembalikan jawaban yang konsisten?