Phương pháp truyền thống là phân tích
MAX()
(hoặc chức năng phân tích khác):
select *
from ( select s.student_id
, w.last_name
, w.first_name
, s.numeric_grade
, max(s.numeric_grade) over () as numeric_final_grade
from grade s
join section z
on s.section_id = z.section_id
join student w
on s.student_id = w.student_id
where z.course_no = 230
and z.section_id = 100
and s.grade_type_code = 'FI'
)
where numeric_grade = numeric_final_grade
Nhưng tôi có thể thích sử dụng FIRST (GIỮ).
select max(s.student_id) keep (dense_rank first order by s.numeric_grade desc) as student_id
, max(w.last_name) keep (dense_rank first order by s.numeric_grade desc) as last_name
, max(w.first_name) keep (dense_rank first order by s.numeric_grade desc) as first_na,e
, max(s.numeric_grade_name) as numeric_final_grade
from grade s
join section z
on s.section_id = z.section_id
join student w
on s.student_id = w.student_id
where z.course_no = 230
and z.section_id = 100
and s.grade_type_code = 'FI'
Lợi ích của cả hai cách tiếp cận này so với những gì bạn đề xuất ban đầu là bạn chỉ quét bảng một lần, không cần phải truy cập bảng hoặc chỉ mục lần thứ hai. Tôi thực sự có thể giới thiệu bài đăng trên blog của Rob van Wijk về sự khác biệt giữa hai điều này.
P.S. chúng sẽ trả về các kết quả khác nhau, vì vậy chúng hơi khác nhau. Hàm phân tích sẽ duy trì các bản sao là hai sinh viên có cùng điểm tối đa (đây là những gì gợi ý của bạn cũng sẽ làm được). Hàm tổng hợp sẽ xóa các bản sao, trả về một bản ghi ngẫu nhiên trong trường hợp hòa.