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.