ORACLE PL/SQL from entry to proficient notes - SQL built-in function analysis function use example (10)

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

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=326069239&siteId=291194637