How to download this book and related resources: pay attention to the WeChat public account, click the function introduction-book link to download, you can get it
10.1 Record Ranking
SELECT s.deptno,
s.ename,
SUM(s.sal) AS sum_sal,
rank() over(PARTITION BY s.deptno ORDER BY SUM(s.sal) DESC NULLS LAST) AS 薪资排名_跳号,
dense_rank() over(PARTITION BY s.deptno ORDER BY SUM(s.sal) DESC NULLS LAST) AS 薪资排名_同级跳号,
row_number() over(PARTITION BY s.deptno ORDER BY SUM(s.sal) DESC NULLS LAST) AS 薪资排名_不跳号
FROM scott.emp s
GROUP BY s.deptno, s.ename
10.2 First and last record query
--薪资排名首位工号是7839,薪资排名末尾工号是7369
SELECT (s.empno), s.sal
FROM scott.emp s
WHERE s.sal IS NOT NULL
AND s.deptno IS NOT NULL
ORDER BY s.sal DESC;
--可以如下统计
SELECT MIN(s.empno) keep(dense_rank FIRST ORDER BY SUM(s.sal) DESC NULLS LAST) AS 薪资排名首位,
MIN(s.empno) keep(dense_rank LAST ORDER BY SUM(s.sal) DESC NULLS LAST) AS 薪资排名末尾
FROM scott.emp s
WHERE s.sal IS NOT NULL
AND s.deptno IS NOT NULL
GROUP BY s.empno;
10.3 Ranking query before and after
SELECT deptno, empno, ename, deptno_sales, xzpm --薪资排名
FROM (SELECT o.deptno,
o.empno,
o.ename,
SUM(o.sal) AS deptno_sales,
rank() over(PARTITION BY o.deptno ORDER BY SUM(o.sal) DESC NULLS LAST) AS xzpm
FROM scott.emp o
WHERE o.deptno IS NOT NULL
GROUP BY o.deptno, o.empno, o.ename)
WHERE xzpm <= 2
10.4 Hierarchical queries
SELECT * FROM
(
SELECT deptno, empno, ename, SUM (sal) dept_sales,
NTILE (3) OVER (PARTITION BY deptno
ORDER BY SUM (sal) NULLS LAST) RANK_RATIO
FROM emp
WHERE deptno IS NOT NULL
GROUP BY deptno, empno, ename
)
WHERE RANK_RATIO=1
10.5 Scope Statistics Query
SELECT empno, ename, hiredate, sal,
MAX (sal) OVER (ORDER BY hiredate ROWS BETWEEN 10 PRECEDING AND CURRENT ROW)
"前10天入职员工最高薪资",
MAX (sal) OVER (ORDER BY hiredate ROWS BETWEEN CURRENT ROW AND 10 FOLLOWING)
"后10天入职员工最高薪资"
FROM emp
WHERE deptno IN (10,20,30) AND sal IS NOT NULL;
10.6 Comparison of Adjacent Records
SELECT ename, hiredate, deptno, sal, sal - prev_sal "与前面的差异",
sal - next_sal "与后面的差异"
FROM (SELECT ename, hiredate, sal, deptno,
LAG (sal, 1, 0) OVER (ORDER BY hiredate) AS prev_sal,
LEAD (sal, 1, 0) OVER (ORDER BY hiredate) AS next_sal
FROM emp
WHERE deptno IS NOT NULL AND SAL IS NOT NULL);
10.7 Suppressing repetitions
SELECT *
FROM (SELECT empno, ename, sal, hiredate,
ROW_NUMBER () OVER (PARTITION BY EXTRACT
(YEAR FROM hiredate) ORDER BY empno) rn
FROM emp
WHERE hiredate IS NOT NULL
AND EXTRACT (YEAR FROM hiredate) IN (1981, 1982, 1983))
WHERE rn = 1;
10.7 Row-column conversion
SELECT job, empno, ename,
ROW_NUMBER () OVER (PARTITION BY job ORDER BY ename) rn
FROM emp
WHERE job IS NOT NULL
I am a programmer. If you think it's well organized, please pay attention to your personal WeChat public account (scan it):