Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

PARTITION BY có và không có KEEP trong Oracle

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óm deptno 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 theo sal (mặc nhiên sử dụng ASC 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, MINDENSE_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 |


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sự khác biệt giữa Chế độ xem và Chế độ xem vật chất hóa trong Oracle là gì?

  2. Làm cách nào để tạo id với AUTO_INCREMENT trên Oracle?

  3. ORA-00918:cột được xác định không rõ ràng trong SELECT *

  4. Chèn các cột mới vào giữa bảng?

  5. Các mô hình định dạng được hỗ trợ cho các hàm ngày ROUND () và TRUNC () trong Oracle