MIN(sal) KEEP (DENSE_RANK FIRST ORDER BY sal) OVER (PARTITION BY deptno)
Câu lệnh có thể được xem xét theo thứ tự (gần đúng) từ phải sang trái:
-
OVER (PARTITION BY deptno)
có nghĩa là phân chia các hàng thành các nhómdeptno
riêng biệt; sau đó -
ORDER BY sal
có nghĩa là, đối với mỗi phân vùng, sắp xếp các hàng theosal
(mặc nhiên sử dụngASC
lệnh kết thúc); sau đó -
KEEP (DENSE_RANK FIRST
có nghĩa là đưa ra xếp hạng (liên tiếp) cho các hàng có thứ tự cho mỗi phân vùng (các hàng có giá trị giống nhau cho các cột thứ tự sẽ được xếp hạng giống nhau) và loại bỏ tất cả các hàng không được xếp hạng đầu tiên; và cuối cùng -
MIN(sal)
đối với các hàng còn lại của mỗi phân vùng, hãy trả lại mức lương tối thiểu.
Trong trường hợp này, MIN
và DENSE_RANK FIRST
cả hai đều đang hoạt động trên sal
cột như vậy sẽ làm điều tương tự và KEEP (DENSE_RANK FIRST ORDER BY sal)
là thừa.
Tuy nhiên, nếu bạn sử dụng một cột khác ở mức tối thiểu thì bạn có thể thấy các tác động:
SQL Fiddle
Thiết lập lược đồ Oracle 11g R2 :
CREATE TABLE test (name, sal, deptno) AS
SELECT 'a', 1, 1 FROM DUAL
UNION ALL SELECT 'b', 1, 1 FROM DUAL
UNION ALL SELECT 'c', 1, 1 FROM DUAL
UNION ALL SELECT 'd', 2, 1 FROM DUAL
UNION ALL SELECT 'e', 3, 1 FROM DUAL
UNION ALL SELECT 'f', 3, 1 FROM DUAL
UNION ALL SELECT 'g', 4, 2 FROM DUAL
UNION ALL SELECT 'h', 4, 2 FROM DUAL
UNION ALL SELECT 'i', 5, 2 FROM DUAL
UNION ALL SELECT 'j', 5, 2 FROM DUAL;
Truy vấn 1 :
SELECT DISTINCT
MIN(sal) KEEP (DENSE_RANK FIRST ORDER BY sal) OVER (PARTITION BY deptno) AS min_sal_first_sal,
MAX(sal) KEEP (DENSE_RANK FIRST ORDER BY sal) OVER (PARTITION BY deptno) AS max_sal_first_sal,
MIN(name) KEEP (DENSE_RANK FIRST ORDER BY sal) OVER (PARTITION BY deptno) AS min_name_first_sal,
MAX(name) KEEP (DENSE_RANK FIRST ORDER BY sal) OVER (PARTITION BY deptno) AS max_name_first_sal,
MIN(name) KEEP (DENSE_RANK LAST ORDER BY sal) OVER (PARTITION BY deptno) AS min_name_last_sal,
MAX(name) KEEP (DENSE_RANK LAST ORDER BY sal) OVER (PARTITION BY deptno) AS max_name_last_sal,
deptno
FROM test
Kết quả :
| MIN_SAL_FIRST_SAL | MAX_SAL_FIRST_SAL | MIN_NAME_FIRST_SAL | MAX_NAME_FIRST_SAL | MIN_NAME_LAST_SAL | MAX_NAME_LAST_SAL | DEPTNO |
|-------------------|-------------------|--------------------|--------------------|-------------------|-------------------|--------|
| 1 | 1 | a | c | e | f | 1 |
| 4 | 4 | g | h | i | j | 2 |