Tôi nghĩ rằng chức năng Rank() không phải là cách để đi với điều này, vì hai lý do.
Thứ nhất, nó có lẽ kém hiệu quả hơn phương pháp dựa trên Min().
Lý do cho điều này là truy vấn phải duy trì danh sách đã đặt hàng của tất cả tiền lương cho mỗi bộ phận vì nó quét dữ liệu và sau đó thứ hạng sẽ được chỉ định bằng cách đọc lại danh sách này. Rõ ràng là trong trường hợp không có các chỉ mục có thể được tận dụng cho điều này, bạn không thể gán một 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 là 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ố đủ để sắp xếp đĩa thì hiệu suất sẽ sụp đổ.
Đâ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 cho đến nay. Nếu giá trị tối thiểu mới gặp phải thì giá trị hiện tại được sửa đổi, nếu không giá trị mới sẽ bị hủy. Tổng số phần tử phải được giữ trong bộ nhớ có liên quan đến số lượng phòng ban, không phải số lượng 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 phải đượ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 là xếp hạng đầu tiên khi tiền lương cho mỗi bộ phận được tăng dần theo thứ tự", đó là "Hồ sơ nào có mức lương tối thiểu cho mỗi bộ phận". Điều đó tạo nên sự khác biệt lớn với tôi, ít nhất.
Nguồn
2009-10-08 07:06:55
Cảm ơn David. Sau khi xem xét các lợi ích của nó, tôi đã tái cấu trúc giải pháp của bạn. –