Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Làm thế nào để hiển thị bản ghi có giá trị cao nhất trong Oracle?

Đôi khi ORA-00907: missing right parenthesis có nghĩa chính xác rằng:chúng ta có một dấu ngoặc vuông bên trái mà không có một dấu ngoặc vuông phù hợp bên phải. Nhưng nó cũng có thể bị lỗi cú pháp trong một phần của câu lệnh được giới hạn bởi dấu ngoặc đơn.

Đó là nguyên nhân thứ hai ở đây:LIMIT là lệnh Mysql mà Oracle không nhận ra. Bạn có thể sử dụng một hàm phân tích tại đây:

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

Điều này sử dụng hàm RANK () sẽ trả về nhiều hơn một hàng nếu một số nghệ sĩ đạt được lợi nhuận trung bình như nhau. Bạn có thể muốn sử dụng ROW_NUMBER () thay thế. Các chức năng phân tích có thể rất mạnh mẽ. Tìm hiểu thêm .

Bạn có thể áp dụng ROWN_NUMBER (), RANK () và DENSE_RANK () cho bất kỳ đầu- n vấn đề. Bạn cũng có thể sử dụng một trong số chúng để giải quyết vấn đề đầu tiên của mình.

Đó có lẽ là một vấn đề dữ liệu. Nếu một trong các số trong (salesPrice - AcquisitionPrice) là null, kết quả sẽ là null và sẽ không được tính vào giá trị trung bình. Nếu tất cả các hàng của một nghệ sĩ là rỗng thì AVG () sẽ là rỗng.

Khi nó xảy ra, thứ tự sắp xếp sẽ đặt NULL cuối cùng. Nhưng vì mệnh đề PARTITION BY được sắp xếp theo AvgProfit desc điều đó đặt kết quả NULL ở thứ hạng 1. Giải pháp là sử dụng NULLS LAST trong mệnh đề cửa sổ:

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

Điều này sẽ đảm bảo cho bạn một kết quả không rỗng ở trên cùng (cung cấp ít nhất một trong các nghệ sĩ của bạn có giá trị trong cả hai cột).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle chọn không trả về tất cả các cột trong sqlplus

  2. Hướng dẫn từng bước để cài đặt hộp ảo Oracle

  3. oracle chuyển đổi thời gian kỷ nguyên unix sang ngày

  4. Lập bản đồ Hibernate - Nối hai bảng với một bảng liên kết - Nhưng có sự thay đổi

  5. Tăng VOTE diskgroup trong ASM để nâng cấp GI 12.2