Xét ví dụ sau: Lấy danh sách nhân viên cho biết với mỗi nhóm công
việc thì mức lương tương ứng của nhân viên trong nhóm công việc đó là
bao nhiêu kèm theo mức lương cao nhất và thấp nhất của nhóm đó.
Để hiểu rõ hơn về yêu cầu trên, ta nhìn vào bảng kết quả sau đây:
Và đây là kết quả câu SELECT:
Một vài lưu ý:
Xét 1 ví dụ khác: Lấy danh sách tổng lương theo phòng ban của công ty kèm theo tổng lương của phòng ban cao nhất và thấp nhất trong công ty.
Đây là bảng kết quả:
Và đây là câu SELECT:
Chúng ta thấy rằng để có thể sử dụng được KEEP ... FIRST/LAST buộc chúng
ta phải có mệnh đề PARTITION BY. Trong trường hợp này khi đã nhóm tổng
lương của các phòng ban lại với nhau chúng ta không có chung 1 nhóm nào
để có thể sử dụng được với KEEP ... FIRST/LAST. Do vậy chúng ta thêm 1
cột chung để nhóm, đó chính là cột COMPANY.
Để hiểu rõ hơn về yêu cầu trên, ta nhìn vào bảng kết quả sau đây:
ENAME
|
JOB
|
SAL
|
Lowest
|
Highest
|
FORD
|
ANALYST
|
3000
|
3000
|
3000
|
SCOTT
|
ANALYST
|
3000
|
3000
|
3000
|
SMITH
|
CLERK
|
800
|
800
|
1300
|
JAMES
|
CLERK
|
950
|
800
|
1300
|
ADAMS
|
CLERK
|
1100
|
800
|
1300
|
MILLER
|
CLERK
|
1300
|
800
|
1300
|
CLARK
|
MANAGER
|
2450
|
2450
|
2975
|
BLAKE
|
MANAGER
|
2850
|
2450
|
2975
|
JONES
|
MANAGER
|
2975
|
2450
|
2975
|
KING
|
PRESIDENT
|
5000
|
5000
|
5000
|
MARTIN
|
SALESMAN
|
1250
|
1250
|
1600
|
WARD
|
SALESMAN
|
1250
|
1250
|
1600
|
TURNER
|
SALESMAN
|
1500
|
1250
|
1600
|
ALLEN
|
SALESMAN
|
1600
|
1250
|
1600
|
Và đây là kết quả câu SELECT:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | SELECT deptno, ename, hiredate, sal,SELECT ename, job, sal, MIN (sal) KEEP (DENSE_RANK FIRST ORDER BY sal) OVER (PARTITION BY job) "Lowest", MAX (sal) KEEP (DENSE_RANK LAST ORDER BY sal) OVER (PARTITION BY job) "Highest" FROM emp ORDER BY job, 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; |
- Mệnh đề KEEP (DENSE_RANK FIRST ORDER BY sal): cho phép chúng ta giữ lại giá trị lương đầu tiên
- Mệnh đề KEEP (DENSE_RANK LAST ORDER BY sal): cho phép chúng ta giữ lại giá trị lương cuối cùng
Xét 1 ví dụ khác: Lấy danh sách tổng lương theo phòng ban của công ty kèm theo tổng lương của phòng ban cao nhất và thấp nhất trong công ty.
Đây là bảng kết quả:
COMPANY
|
DEPTNO
|
DEPT_SAL
|
Lowest
|
Highest
|
ABC Company Ltd.
|
10
|
8750
|
8750
|
10875
|
ABC Company Ltd.
|
30
|
9400
|
8750
|
10875
|
ABC Company Ltd.
|
20
|
10875
|
8750
|
10875
|
Và đây là câu SELECT:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | SELECT company, deptno, dept_sal, MIN (dept_sal) KEEP (DENSE_RANK FIRST ORDER BY dept_sal) OVER (PARTITION BY company) "Lowest", MAX (dept_sal) KEEP (DENSE_RANK LAST ORDER BY dept_sal) OVER (PARTITION BY company) "Highest" FROM (SELECT 'ABC Company Ltd.' company, deptno, SUM (sal) dept_sal FROM emp GROUP BY deptno) ORDER BY dept_sal; |