Đ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-)