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

Nhận các giá trị liên quan đến các hàng tối đa và tối thiểu trong Oracle

Điều này có thể dễ dàng giải quyết bằng các hàm phân tích. Như bạn có thể thấy, có hai nhân viên kiếm được mức lương tối đa trong DEPT 20; đây là một chi tiết quan trọng, vì một số giải pháp phổ biến cho loại vấn đề này bỏ sót thông tin đó.

SQL> select ename
  2             , deptno
  3             , sal
  4  from (
  5      select ename
  6             , deptno
  7             , sal
  8             , max (sal) over (partition by deptno) max_sal
  9             , min (sal) over (partition by deptno) min_sal
 10      from emp
 11      )
 12  where sal = max_sal
 13  or    sal = min_sal
 14  order by deptno, sal
 15  /

ENAME          DEPTNO        SAL
---------- ---------- ----------
KISHORE            10       1300
SCHNEIDER          10       5000
CLARKE             20        800
RIGBY              20       3000
GASPAROTTO         20       3000
HALL               30        950
LIRA               30       3750
TRICHLER           50       3500
FEUERSTEIN         50       4500

9 rows selected.

SQL>

Rất tiếc, tôi đã bỏ lỡ một chi tiết quan trọng về định dạng kết quả. Dữ liệu của tôi sẽ không phù hợp với đầu ra được yêu cầu vì có hai nhân viên đang kiếm được mức lương tối đa. Vì vậy, truy vấn này, mà tôi thừa nhận là hơi khó xử, cung cấp cho chúng tôi bố cục bắt buộc. MIN () trên tên nhân viên trả về thứ tự bảng chữ cái:

SQL> select
  2         deptno
  3         , max (case when sal = min_sal then min_sal else null end ) as min_sal
  4         , min (case when sal = min_sal then ename else null end ) as min_name
  5         , max (case when sal = max_sal then max_sal else null end ) as max_sal
  6         , min (case when sal = max_sal then ename else null end ) as max_name
  7  from (
  8      select ename
  9             , deptno
 10             , sal
 11             , max (sal) over (partition by deptno) max_sal
 12             , min (sal) over (partition by deptno) min_sal
 13      from emp
 14      )
 15  where sal = max_sal
 16  or    sal = min_sal
 17  group by deptno
 18  order by deptno
 19  /

    DEPTNO    MIN_SAL MIN_NAME      MAX_SAL MAX_NAME
---------- ---------- ---------- ---------- ----------
        10       1300 KISHORE          5000 SCHNEIDER
        20        800 CLARKE           3000 GASPAROTTO
        30        950 HALL             3750 LIRA
        50       3500 TRICHLER         4500 FEUERSTEIN

SQL>

Tôi không thích giải pháp này. Hầu hết các bộ dữ liệu sẽ chứa các xung đột như vậy và chúng ta cần phải thừa nhận chúng. Việc lọc kết quả dựa trên một số tiêu chí không liên quan để phù hợp với bố cục báo cáo Procrustean là sai lầm. Tôi muốn một bố cục báo cáo phản ánh toàn bộ tập dữ liệu. Cuối cùng, nó phụ thuộc vào mục đích kinh doanh mà truy vấn phục vụ. Và tất nhiên, khách hàng luôn đúng 8-)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Từ Thủ tục đã lưu, trả về tham số OUT &con trỏ OUT &kết quả phân tích cú pháp (Oracle)

  2. Không hiểu tại sao SQL của tôi không hoạt động

  3. Làm cách nào để lấy số phần tử trong mảng JSON được lưu trữ dưới dạng CLOB với Oracle 12c?

  4. Ví dụ về hàm Oracle (Số trả về)

  5. Bí danh Tên cột trong câu lệnh nhiều trường hợp