MAX() KEEP (DENSE_RANK LAST ORDER BY ) OVER() PARTITION BY()
KEEP DENSE_RANK
-- Create table
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;
select * from test ;
N SAL DEPTNO
- ---------- ----------
a 1 1
b 1 1
c 1 1
d 2 1
e 3 1
f 3 1
g 4 2
h 4 2
i 5 2
j 5 2
10 rows selected.
SQL !!
set linesize 300
col min_name_first_sal for a16
col max_name_first_sal for a16
col min_name_last_sa for a16
col max_name_last_sal for a16
col min_name_last_sal for a16
SELECT DISTINCT
deptno,
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 desc ) 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;
DEPTNO MIN_SAL_FIRST_SAL MAX_SAL_FIRST_SAL MIN_NAME_FIRST_S MAX_NAME_FIRST_S MIN_NAME_LAST_SA MAX_NAME_LAST_SA DEPTNO
---------- ----------------- ----------------- ---------------- ---------------- ---------------- ---------------- ----------
2 4 5 g h i j 2
1 1 3 a c e f 1
select * from test ;
N SAL DEPTNO
- ---------- ----------
a 1 1
b 1 1
c 1 1
d 2 1
e 3 1
f 3 1
g 4 2
h 4 2
i 5 2
j 5 2
10 rows selected.
col least_salary_person for a18
select o.deptno
,min(o.sal) keep (dense_rank first order by o.sal, o.name) least_salary
,max(o.sal) keep (dense_rank last order by o.sal , o.name ) MAX_salary
,min(o.name) keep (dense_rank first order by o.sal, o.name ) least_salary_person
from test o
group by o.deptno;
DEPTNO LEAST_SALARY MAX_SALARY LEAST_SALARY_PERSO
---------- ------------ ---------- ------------------
1 1 3 a
2 4 5 g
====
select empno,
deptno,
sal,
dense_rank() over (partition by deptno order by sal) as myrank
from scott.emp;
SQL> SQL> 2 3 4 5
EMPNO DEPTNO SAL MYRANK
---------- ---------- ---------- ----------
7934 10 1300 1
7782 10 2450 2
7839 10 5000 3
7369 20 800 1
7876 20 1100 2
7566 20 2975 3
7788 20 3000 4
7902 20 3000 4
7900 30 950 1
7654 30 1250 2
7521 30 1250 2
7844 30 1500 3
7499 30 1600 4
7698 30 2850 5
14 rows selected.
SQL> SQL>
select * from (select empno,
deptno,
sal,
dense_rank() over (partition by deptno order by sal ) as myrank
from scott.emp
)
where 1=1
and MYRANK=4
;
EMPNO DEPTNO SAL MYRANK
---------- ---------- ---------- ----------
7788 20 3000 4
7902 20 3000 4
7499 30 1600 4
SQL>