- [SQLSERVER] Loại bỏ Restricted User trên database MSSQL
- [C#] Hướng dẫn tạo mã QRcode Style trên winform
- [C#] Hướng dẫn sử dụng temp mail service api trên winform
- [C#] Hướng dẫn tạo mã thanh toán VietQR Pay không sử dụng API trên winform
- [C#] Hướng Dẫn Tạo Windows Service Đơn Giản Bằng Topshelf
- [C#] Chia sẻ source code đọc dữ liệu từ Google Sheet trên winform
- [C#] Chia sẻ source code tạo mã QR MOMO đa năng Winform
- [C#] Chia sẻ source code phần mềm lên lịch tự động chạy ứng dụng Scheduler Task Winform
- [Phần mềm] Tải và cài đặt phần mềm Sublime Text 4180 full version
- [C#] Hướng dẫn download file từ Minio Server Winform
- [C#] Hướng dẫn đăng nhập zalo login sử dụng API v4 trên winform
- [SOFTWARE] Phần mềm gởi tin nhắn Zalo Marketing Pro giá rẻ mềm nhất thị trường
- [C#] Việt hóa Text Button trên MessageBox Dialog Winform
- [DEVEXPRESS] Chia sẻ code các tạo report in nhiều hóa đơn trên XtraReport C#
- [POWER AUTOMATE] Hướng dẫn gởi tin nhắn zalo từ file Excel - No code
- [C#] Chia sẻ code lock và unlock user trong domain Window
- [DEVEXPRESS] Vẽ Biểu Đồ Stock Chứng Khoán - Công Cụ Thiết Yếu Cho Nhà Đầu Tư trên Winform
- [C#] Hướng dẫn bảo mật ứng dụng 2FA (Multi-factor Authentication) trên Winform
- [C#] Hướng dẫn convert HTML code sang PDF File trên NetCore 7 Winform
- [C#] Hướng dẫn viết ứng dụng chat với Gemini AI Google Winform
[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