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

Hàm phân tích Oracle cho giá trị nhỏ nhất trong nhóm

Tôi nghĩ rằng hàm Rank () không phải là cách để thực hiện điều này, vì hai lý do.

Thứ nhất, nó có thể kém hiệu quả hơn phương thức dựa trên Min ().

Lý do cho điều này là truy vấn phải duy trì một danh sách có thứ tự của tất cả các mức lương cho mỗi bộ phận khi nó quét dữ liệu và xếp hạng sau đó sẽ được chỉ định sau bằng cách đọc lại danh sách này. Rõ ràng là trong trường hợp không có chỉ mục có thể được tận dụng cho việc này, bạn không thể chỉ định thứ hạng cho đến khi mục dữ liệu cuối cùng được đọc và việc duy trì danh sách rất tốn kém.

Vì vậy, hiệu suất của hàm Rank () phụ thuộc vào tổng số phần tử được quét và nếu số lượng đủ để sắp xếp tràn vào đĩa thì hiệu suất sẽ giảm.

Điều này có lẽ hiệu quả hơn:

select dept,
       emp,
       salary
from
       (
       SELECT dept, 
              emp,
              salary,
              Min(salary) Over (Partition By dept) min_salary
       FROM   mytable
       )
where salary = min_salary
/

Phương pháp này chỉ yêu cầu truy vấn duy trì một giá trị duy nhất cho mỗi bộ phận của giá trị tối thiểu gặp phải cho đến nay. Nếu gặp phải mức tối thiểu mới thì giá trị hiện có sẽ được sửa đổi, nếu không giá trị mới sẽ bị loại bỏ. Tổng số phần tử phải được lưu giữ trong bộ nhớ liên quan đến số phòng ban, không phải số hàng được quét.

Có thể là Oracle có một đường dẫn mã để nhận ra rằng Xếp hạng không thực sự cần được tính toán trong trường hợp này, nhưng tôi sẽ không đặt cược vào nó.

Lý do thứ hai cho việc không thích Xếp hạng () là nó chỉ trả lời sai câu hỏi. Câu hỏi không phải là "Hồ sơ nào có mức lương xếp hạng đầu tiên khi mức lương cho mỗi bộ phận tăng dần theo thứ tự", mà là "Hồ sơ nào có mức lương tối thiểu cho mỗi bộ phận". Điều đó tạo ra sự khác biệt lớn đối với tôi.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bảng cơ sở dữ liệu Oracle trong gridview

  2. Python DPI-1047 Không thể định vị dlopen (libclntsh.dylib) trên macOS

  3. Làm thế nào để phát triển một kích hoạt lỗi máy chủ sau trong Oracle?

  4. SSIS - không thể chuyển đổi giá trị do có khả năng mất dữ liệu

  5. danh sách được phân tách bằng dấu phẩy là kết quả của câu lệnh select trong Oracle