- [VB.NET] Hướng dẫn giải captcha sử dụng dịch vụ AZCaptcha API trên winform
- [C#] Hướng dẫn chứng thực đăng nhập ứng dụng bằng vân tay (Finger Print) trên máy tính
- [C#] Color Thief cách xuất màu sắc thiết kế từ hình ảnh
- [C#] Cách tạo bản quyền và cho phép dùng thử ứng dụng Winform
- [C#] Hướng dẫn sử dụng trình duyệt web Chrome convert HTML sang tập tin file PDF
- [C#] Kết nôi điện thoại Android, IOS với App Winform via Bluetooth
- [DATABASE] Cách query cộng trừ dồn dần trong Sqlserver
- [C#] Thiết kế ứng dụng Console đẹp với thư viện Spectre.Console
- [C#] Thiết kế ứng dụng Single Instance và đưa ứng dụng lên trước nếu kiểm tra ứng dụng đang chạy
- [C#] Giới thiệu JSON Web Token và cách đọc chuỗi token
- [C#] Cách tăng giảm font chữ tất cả các control trên winform
- [DEVEXPRESS] Tích hợp chức năng Tìm kiếm Search vào CheckedComboboxEdit
- [C#] Gởi email Metting Calendar Reminder kèm nhắc thời gian lịch họp
- [C#] Tìm kiếm xem danh sách từ khóa có tồn tại trong đoạn văn bản hay không
- [C#] Thiết kế giao diện ứng dụng trên Console sử dụng thư viện Terminal.Gui
- [C#] Hướng dẫn tạo mã VietQR Payment API Winform
- [C#] Sử dụng thư viện BenchmarkDotNet đo hiệu năng của hảm Method
- [DEVEXPRESS] Tìm kiếm không dấu tô màu highlight có dấu trên C# Winform
- [C#] Chia sẻ source code tạo hiệu ứng pixel Image trên winform
- [C#] Hướng dẫn kiểm tra số Container hợp lệ hay không
[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