- [VB.NET] Lấy địa chỉ Bios Serial Number trên Winform
- [C#] Giới thiệu và sử dụng thư viện AutoMapper
- [DEVEXPRESS] Hướng dẫn Custom Summary in Footer trong Gridview C#
- [C#] Dependency Injection in Winform
- [SQLSERVER] Hướng dẫn tìm kiếm nâng cao trên sql
- [C#] Hướng dẫn sử dụng SetTimeOut trên Winform like Javascript
- [DATABASE] In cây thông noel bằng sqlserver
- [C#] Hướng dẫn fix lỗi hiển thị UTF-8 khi sử dụng WebClient Download String
- [DATABASE] Hướng dẫn mã hóa và giải mã sử dụng thuật toán AES 256 trên sqlserver
- [DATABASE] Base64 Encode and Decode trong Sqlserver
- [C#] Vì Mẹ anh bắt phải Fake địa chỉ MacAddress
- [C#] Hướng dẫn xuất dữ liệu từ DataGridview ra file Excel
- [C#] Hướng dẫn khởi động lại chương trình ứng dụng winform
- [C#] Sự khác nhau giữa String.IsNullOrEmpty và String.IsNullOrWhiteSpace
- [C#] Hướng dẫn đọc file hình ảnh định dạng WEBP và chuyển đổi WebP sang JPG
- [C#] Kiểm tra phiên bản Microsoft Office đang sử dụng trên máy tính
- [C#] Hướng dẫn chuyển đổi tập tin hình ảnh XPS sang Bitmap
- [C#] Giới thiệu Component WebView2 của Microsoft
- [C#] Hướng dẫn lưu tất cả hình ảnh từ File Excel vào thư mục window
- [DATABASE] Hướng dẫn import và export hình ảnh image từ Sqlserver
[DATABASE] Hướng dẫn sử dụng hàm ROW_NUMBER, RANK và DENSE_RANK trong Sqlserver
Bài viết hôm nay, mình xin hướng dẫn các bạn sử dụng các hàm: ROW_NUMBER, RANK và DENSE_RANK trong Sqlserver.
[DATABASE] Hướng dẫn sử dụng ROW_NUMBER, RANK và DENSE_RANK trong sqlserver
VD: Chúng ta có yêu cầu như sau
- Lấy danh sách nhân viên dựa vào ngày ký hợp đồng cho biết nhân viên đó là người thứ mấy trong phòng được ký hợp đồng
- Lấy danh sách nhân viên dựa vào lương cho biết nhân viên đó xếp hạng thứ mấy trong phòng
Với yêu cầu 1, ta có bảng kết quả sau:
DEPTNO
|
ENAME
|
HIREDATE
|
SAL
|
NUM
|
10
|
CLARK
|
09/06/1981
|
2450
|
1
|
10
|
KING
|
17/11/1981
|
5000
|
2
|
10
|
MILLER
|
23/01/1982
|
1300
|
3
|
20
|
SMITH
|
17/12/1980
|
800
|
1
|
20
|
JONES
|
02/04/1981
|
2975
|
2
|
20
|
FORD
|
03/12/1981
|
3000
|
3
|
20
|
SCOTT
|
09/12/1982
|
3000
|
4
|
20
|
ADAMS
|
12/01/1983
|
1100
|
5
|
30
|
ALLEN
|
20/02/1981
|
1600
|
1
|
30
|
WARD
|
22/02/1981
|
1250
|
2
|
30
|
BLAKE
|
01/05/1981
|
2850
|
3
|
30
|
TURNER
|
08/09/1981
|
1500
|
4
|
30
|
MARTIN
|
28/09/1981
|
1250
|
5
|
30
|
JAMES
|
03/12/1981
|
950
|
6
|
Và đây là câu SELECT kết hợp với ROW_NUMBER để thực hiện:
SELECT deptno,
ename,
hiredate,
sal,
ROW_NUMBER () OVER (PARTITION BY deptno ORDER BY hiredate) num
FROM emp
ORDER BY deptno, num;
Với yêu cầu số 2, ta có bảng kết quả sau:
DEPTNO
|
ENAME
|
HIREDATE
|
SAL
|
RANK_SAL
|
DENSE_RANK_SAL
|
10
|
MILLER
|
1/23/1982
|
1300
|
1
|
1
|
10
|
CLARK
|
6/9/1981
|
2450
|
2
|
2
|
10
|
KING
|
11/17/1981
|
5000
|
3
|
3
|
20
|
SMITH
|
12/17/1980
|
800
|
1
|
1
|
20
|
ADAMS
|
1/12/1983
|
1100
|
2
|
2
|
20
|
JONES
|
4/2/1981
|
2975
|
3
|
3
|
20
|
SCOTT
|
12/9/1982
|
3000
|
4
|
4
|
20
|
FORD
|
12/3/1981
|
3000
|
4
|
4
|
30
|
JAMES
|
12/3/1981
|
950
|
1
|
1
|
30
|
MARTIN
|
9/28/1981
|
1250
|
2
|
2
|
30
|
WARD
|
2/22/1981
|
1250
|
2
|
2
|
30
|
TURNER
|
9/8/1981
|
1500
|
4
|
3
|
30
|
ALLEN
|
2/20/1981
|
1600
|
5
|
4
|
30
|
BLAKE
|
5/1/1981
|
2850
|
6
|
5
|
Và đây là câu SELECT kết hợp với RANK và DENSE_RANK để thực hiện:
SELECT deptno,
ename,
hiredate,
sal,
RANK () OVER (PARTITION BY deptno ORDER BY sal) rank_sal,
DENSE_RANK () OVER (PARTITION BY deptno ORDER BY sal) dense_rank_sal
FROM emp
ORDER BY deptno;
Nhìn vào kết quả trên ta thấy rằng kết quả của hàm RANK và DENSE_RANK có những điểm như sau:
- Giống nhau: với những dòng có cùng SAL thì sẽ có cùng hạng
- Khác nhau:
+ Hàm RANK sẽ bỏ qua thứ hạng tiếp theo cho những dòng có cùng hạng trước đó
+ Hàm DENSE_RANK không bỏ qua thứ hạng tiếp theo cho những dòng có cùng hạng trước đó
LaptrinhVB via oracletechtalk.blogspot.com