Hiệu ứng tương tự có thể được sao chép trong Oracle bằng cách sử dụng first_value()
hoặc bằng cách sử dụng một trong các rank()
hoặc row_number()
chức năng.
Cả hai biến thể cũng hoạt động trong Postgres.
first_value()
select distinct col1,
first_value(col2) over (partition by col1 order by col2 asc)
from tmp
first_value
cung cấp giá trị đầu tiên cho phân vùng, nhưng lặp lại nó cho mỗi hàng, vì vậy cần phải sử dụng nó kết hợp với distinct
để có được một hàng duy nhất cho mỗi phân vùng.
row_number()
/ rank()
select col1, col2 from (
select col1, col2,
row_number() over (partition by col1 order by col2 asc) as rownumber
from tmp
) foo
where rownumber = 1
Thay thế row_number()
với rank()
trong ví dụ này mang lại cùng một kết quả.
Một tính năng của biến thể này là nó có thể được sử dụng để tìm nạp N đầu tiên hàng cho một phân vùng nhất định (ví dụ:"3 lần cập nhật gần đây nhất") chỉ bằng cách thay đổi rownumber = 1
tới rownumber <= N
.