Oracle PL/SQL/Analytical Functions/Rank

Материал из SQL эксперт
Перейти к: навигация, поиск

Browse Products with ranking function

   <source lang="sql">
 

SQL> SQL> SQL> CREATE TABLE Product (

 2  ProductID INT NOT NULL PRIMARY KEY,
 3  Name VARCHAR(50) NOT NULL,
 4  Description VARCHAR(1000) NOT NULL,
 5  Price NUMBER NULL,
 6  ImagePath VARCHAR(50) NULL,
 7  soldout NUMBER(1,0) NULL,
 8  Promotion NUMBER(1,0) NULL);

Table created. SQL> SQL> CREATE SEQUENCE ProductIDSeq; Sequence created. SQL> SQL> CREATE OR REPLACE TRIGGER ProductAutonumberTrigger

 2  BEFORE INSERT ON Product
 3  FOR EACH ROW
 4  BEGIN
 5     SELECT ProductIDSeq.NEXTVAL
 6     INTO :NEW.ProductID FROM DUAL;
 7  END;
 8  /

Trigger created. SQL> SQL> INSERT INTO Product (Name, Description, Price, ImagePath,soldout, Promotion)

 2  VALUES ("Pen", "Ball Pen",5.99, "pen.jpg", 1, 0);

1 row created. SQL> SQL> INSERT INTO Product (Name, Description, Price, ImagePath, soldout, Promotion)

 2  VALUES ("Ruler", "Long",14.99, "ruler.jpg", 0, 0);

1 row created. SQL> SQL> INSERT INTO Product (Name, Description, Price, ImagePath, soldout, Promotion)

 2  VALUES ("Desk", "Computer Desk",5.99, "desk.jpg", 0, 1);

1 row created. SQL> SQL> INSERT INTO Product (Name, Description, Price, ImagePath, soldout, Promotion)

 2  VALUES ("PC", "Notebook",49.99, "pc.jpg", 0, 1);

1 row created. SQL> SQL> INSERT INTO Product (Name, Description, Price, ImagePath, soldout, Promotion)

 2  VALUES ("Mouse", "Wireless",9.99, "mouse.jpg",  1, 0);

1 row created. SQL> SQL> INSERT INTO Product (Name, Description, Price, ImagePath, soldout, Promotion)

 2  VALUES ("Keyboard", "keyboard",3.75, "keyboard.jpg", 0, 0);

1 row created. SQL> SQL> SQL> SQL> SELECT ProductID, Name FROM(

 2  SELECT RANK() OVER (ORDER BY ProductID) As RanPeter, ProductID, Name
 3  FROM Product
 4  ORDER BY PRODUCTID
 5  )
 6  WHERE RanPeter BETWEEN 6 AND 10;
PRODUCTID NAME

--------------------------------------------------
        6 Keyboard

1 row selected. SQL> SQL> drop table product; Table dropped. SQL> drop sequence ProductIDSeq; Sequence dropped.


 </source>
   
  


Rank(): If the statement requests another ordering, another sort may result

   <source lang="sql">

SQL> SQL> -- create demo table SQL> create table Employee(

 2    empno              Number(3)  NOT NULL, -- Employee ID
 3    ename              VARCHAR2(10 BYTE),   -- Employee Name
 4    hireDate          DATE,                -- Date Employee Hired
 5    orig_salary        Number(8,2),         -- Orignal Salary
 6    curr_salary        Number(8,2),         -- Current Salary
 7    region             VARCHAR2(1 BYTE)     -- Region where employeed
 8  )
 9  /

Table created. SQL> SQL> create table job(

 2    empno              Number(3)  NOT NULL, -- Employee ID
 3    jobtitle           VARCHAR2(10 BYTE)    -- Employee job title
 4  )
 5  /

Table created. SQL> -- prepare data for employee table SQL> insert into Employee(empno, ename, hireDate, orig_salary, curr_salary, region)

 2                values(122,"Alison",to_date("19960321","YYYYMMDD"), 45000,       48000,       "E")
 3  /

1 row created. SQL> insert into Employee(empno, ename, hireDate, orig_salary, curr_salary, region)

 2                values(123, "James",to_date("19781212","YYYYMMDD"), 23000,       32000,       "W")
 3  /

1 row created. SQL> insert into Employee(empno, ename, hireDate, orig_salary, curr_salary, region)

 2                values(104,"Celia",to_date("19821024","YYYYMMDD"), 53000,       58000,        "E")
 3  /

1 row created. SQL> insert into Employee(empno, ename, hireDate, orig_salary, curr_salary, region)

 2                values(105,"Robert",to_date("19840115","YYYYMMDD"), 31000,      36000,        "W")
 3  /

1 row created. SQL> insert into Employee(empno, ename, hireDate, orig_salary, curr_salary, region)

 2                values(116,"Linda", to_date("19870730","YYYYMMDD"), 43000,       53000,       "E")
 3  /

1 row created. SQL> insert into Employee(empno, ename, hireDate, orig_salary, curr_salary, region)

 2                values(117,"David", to_date("19901231","YYYYMMDD"), 78000,       85000,       "W")
 3  /

1 row created. SQL> insert into Employee(empno, ename, hireDate, orig_salary, curr_salary, region)

 2                values(108,"Jode",  to_date("19960917","YYYYMMDD"), 21000,       29000,       "E")
 3  /

1 row created. SQL> SQL> -- prepare data for job table SQL> SQL> insert into job(empno, jobtitle)

 2           values(101,   "Painter");

1 row created. SQL> SQL> insert into job(empno, jobtitle)

 2           values(122,   "Tester");

1 row created. SQL> SQL> insert into job(empno, jobtitle)

 2           values(123,   "Dediator");

1 row created. SQL> SQL> insert into job(empno, jobtitle)

 2           values(104,   "Chemist");

1 row created. SQL> SQL> insert into job(empno, jobtitle)

 2           values(105,   "Accountant");

1 row created. SQL> SQL> insert into job(empno, jobtitle)

 2           values(116,   "Manager");

1 row created. SQL> SQL> insert into job(empno, jobtitle)

 2           values(117,   "Programmer");

1 row created. SQL> SQL> insert into job(empno, jobtitle)

 2           values(108,   "Developer");

1 row created. SQL> SQL> SQL> -- display data in the table SQL> select * from Employee

 2  /

Hit a key to continue

    EMPNO ENAME      HIREDATE  ORIG_SALARY CURR_SALARY R

---------- --------- ----------- ----------- -
      122 Alison     21-MAR-96       45000       48000 E
      123 James      12-DEC-78       23000       32000 W
      104 Celia      24-OCT-82       53000       58000 E
      105 Robert     15-JAN-84       31000       36000 W
      116 Linda      30-JUL-87       43000       53000 E
      117 David      31-DEC-90       78000       85000 W
      108 Jode       17-SEP-96       21000       29000 E

7 rows selected. SQL> select * from job; Hit a key to continue

    EMPNO JOBTITLE

----------
      101 Painter
      122 Tester
      123 Dediator
      104 Chemist
      105 Accountant
      116 Manager
      117 Programmer
      108 Developer

8 rows selected. SQL> SQL> -- If the statement requests another ordering, another sort may result SQL> SQL> SELECT empno, ename, curr_salary,

 2    RANK() OVER(ORDER BY curr_salary)
 3  FROM employee
 4  WHERE curr_salary > 3800
 5  ORDER BY ename;

Hit a key to continue

    EMPNO ENAME      CURR_SALARY RANK()OVER(ORDERBYCURR_SALARY)

---------- ----------- ------------------------------
      122 Alison           48000                              4
      104 Celia            58000                              6
      117 David            85000                              7
      123 James            32000                              2
      108 Jode             29000                              1
      116 Linda            53000                              5
      105 Robert           36000                              3

7 rows selected. SQL> drop table job; Table dropped. SQL> SQL> -- clean the table SQL> drop table Employee; Table dropped. SQL> SQL>


 </source>
   
  


Rank() over partition

   <source lang="sql">
 

SQL> SQL> CREATE TABLE EMP (EMPNO NUMBER(4) NOT NULL,

 2                    ENAME VARCHAR2(10),
 3                    JOB VARCHAR2(9),
 4                    MGR NUMBER(4),
 5                    HIREDATE DATE,
 6                    SAL NUMBER(7, 2),
 7                    COMM NUMBER(7, 2),
 8                    DEPTNO NUMBER(2));

Table created. SQL> SQL> INSERT INTO EMP VALUES (7369, "SMITH", "CLERK", 7902, TO_DATE("17-DEC-1980", "DD-MON-YYYY"), 800, NULL, 20); 1 row created. SQL> INSERT INTO EMP VALUES (7499, "ALLEN", "SALESMAN", 7698, TO_DATE("20-FEB-1981", "DD-MON-YYYY"), 1600, 300, 30); 1 row created. SQL> INSERT INTO EMP VALUES (7521, "WARD", "SALESMAN", 7698, TO_DATE("22-FEB-1981", "DD-MON-YYYY"), 1250, 500, 30); 1 row created. SQL> INSERT INTO EMP VALUES (7566, "JONES", "MANAGER", 7839, TO_DATE("2-APR-1981", "DD-MON-YYYY"), 2975, NULL, 20); 1 row created. SQL> INSERT INTO EMP VALUES (7654, "MARTIN", "SALESMAN", 7698,TO_DATE("28-SEP-1981", "DD-MON-YYYY"), 1250, 1400, 30); 1 row created. SQL> INSERT INTO EMP VALUES (7698, "BLAKE", "MANAGER", 7839,TO_DATE("1-MAY-1981", "DD-MON-YYYY"), 2850, NULL, 30); 1 row created. SQL> INSERT INTO EMP VALUES (7782, "CLARK", "MANAGER", 7839,TO_DATE("9-JUN-1981", "DD-MON-YYYY"), 2450, NULL, 10); 1 row created. SQL> INSERT INTO EMP VALUES (7788, "SCOTT", "ANALYST", 7566,TO_DATE("09-DEC-1982", "DD-MON-YYYY"), 3000, NULL, 20); 1 row created. SQL> INSERT INTO EMP VALUES (7839, "KING", "PRESIDENT", NULL,TO_DATE("17-NOV-1981", "DD-MON-YYYY"), 5000, NULL, 10); 1 row created. SQL> INSERT INTO EMP VALUES (7844, "TURNER", "SALESMAN", 7698,TO_DATE("8-SEP-1981", "DD-MON-YYYY"), 1500, 0, 30); 1 row created. SQL> INSERT INTO EMP VALUES (7876, "ADAMS", "CLERK", 7788,TO_DATE("12-JAN-1983", "DD-MON-YYYY"), 1100, NULL, 20); 1 row created. SQL> INSERT INTO EMP VALUES (7900, "JAMES", "CLERK", 7698,TO_DATE("3-DEC-1981", "DD-MON-YYYY"), 950, NULL, 30); 1 row created. SQL> INSERT INTO EMP VALUES (7902, "FORD", "ANALYST", 7566,TO_DATE("3-DEC-1981", "DD-MON-YYYY"), 3000, NULL, 20); 1 row created. SQL> INSERT INTO EMP VALUES (7934, "MILLER", "CLERK", 7782,TO_DATE("23-JAN-1982", "DD-MON-YYYY"), 1300, NULL, 10); 1 row created. SQL> SQL> CREATE TABLE DEPT (DEPTNO NUMBER(2),DNAME VARCHAR2(14),LOC VARCHAR2(13) ); Table created. SQL> SQL> INSERT INTO DEPT VALUES (10, "ACCOUNTING", "NEW YORK"); 1 row created. SQL> INSERT INTO DEPT VALUES (20, "RESEARCH", "DALLAS"); 1 row created. SQL> INSERT INTO DEPT VALUES (30, "SALES", "CHICAGO"); 1 row created. SQL> INSERT INTO DEPT VALUES (40, "OPERATIONS", "BOSTON"); 1 row created. SQL> SQL> select rank() over ( partition by to_char(hiredate,"yy")

 2  order by hiredate ) "RANK",
 3  ename,hiredate
 4  from emp
 5  order by hiredate;
     RANK ENAME      HIREDATE

---------- ---------
        1 SMITH      17-DEC-80
        1 ALLEN      20-FEB-81
        2 WARD       22-FEB-81
        3 JONES      02-APR-81
        4 BLAKE      01-MAY-81
        5 CLARK      09-JUN-81
        6 TURNER     08-SEP-81
        7 MARTIN     28-SEP-81
        8 KING       17-NOV-81
        9 JAMES      03-DEC-81
        9 FORD       03-DEC-81
     RANK ENAME      HIREDATE

---------- ---------
        1 MILLER     23-JAN-82
        2 SCOTT      09-DEC-82
        1 ADAMS      12-JAN-83

14 rows selected. SQL> SQL> drop table emp cascade constraints; Table dropped. SQL> drop table dept cascade constraints; Table dropped.

 </source>
   
  


rank() over (partition by deptno order by sal desc )

   <source lang="sql">
 

SQL> SQL> CREATE TABLE EMP(

 2      EMPNO NUMBER(4) NOT NULL,
 3      ENAME VARCHAR2(10),
 4      JOB VARCHAR2(9),
 5      MGR NUMBER(4),
 6      HIREDATE DATE,
 7      SAL NUMBER(7, 2),
 8      COMM NUMBER(7, 2),
 9      DEPTNO NUMBER(2)
10  );

Table created. SQL> SQL> INSERT INTO EMP VALUES(7369, "SMITH", "CLERK", 7902,TO_DATE("17-DEC-1980", "DD-MON-YYYY"), 800, NULL, 20); 1 row created. SQL> INSERT INTO EMP VALUES(7499, "ALLEN", "SALESMAN", 7698,TO_DATE("20-FEB-1981", "DD-MON-YYYY"), 1600, 300, 30); 1 row created. SQL> INSERT INTO EMP VALUES(7521, "WARD", "SALESMAN", 7698,TO_DATE("22-FEB-1981", "DD-MON-YYYY"), 1250, 500, 30); 1 row created. SQL> INSERT INTO EMP VALUES(7566, "JONES", "MANAGER", 7839,TO_DATE("2-APR-1981", "DD-MON-YYYY"), 2975, NULL, 20); 1 row created. SQL> INSERT INTO EMP VALUES(7654, "MARTIN", "SALESMAN", 7698,TO_DATE("28-SEP-1981", "DD-MON-YYYY"), 1250, 1400, 30); 1 row created. SQL> INSERT INTO EMP VALUES(7698, "BLAKE", "MANAGER", 7839,TO_DATE("1-MAY-1981", "DD-MON-YYYY"), 2850, NULL, 30); 1 row created. SQL> INSERT INTO EMP VALUES(7782, "CLARK", "MANAGER", 7839,TO_DATE("9-JUN-1981", "DD-MON-YYYY"), 2450, NULL, 10); 1 row created. SQL> INSERT INTO EMP VALUES(7788, "SCOTT", "ANALYST", 7566,TO_DATE("09-DEC-1982", "DD-MON-YYYY"), 3000, NULL, 20); 1 row created. SQL> INSERT INTO EMP VALUES(7839, "KING", "PRESIDENT", NULL,TO_DATE("17-NOV-1981", "DD-MON-YYYY"), 5000, NULL, 10); 1 row created. SQL> INSERT INTO EMP VALUES(7844, "TURNER", "SALESMAN", 7698,TO_DATE("8-SEP-1981", "DD-MON-YYYY"), 1500, 0, 30); 1 row created. SQL> INSERT INTO EMP VALUES(7876, "ADAMS", "CLERK", 7788,TO_DATE("12-JAN-1983", "DD-MON-YYYY"), 1100, NULL, 20); 1 row created. SQL> INSERT INTO EMP VALUES(7900, "JAMES", "CLERK", 7698,TO_DATE("3-DEC-1981", "DD-MON-YYYY"), 950, NULL, 30); 1 row created. SQL> INSERT INTO EMP VALUES(7902, "FORD", "ANALYST", 7566,TO_DATE("3-DEC-1981", "DD-MON-YYYY"), 3000, NULL, 20); 1 row created. SQL> INSERT INTO EMP VALUES(7934, "MILLER", "CLERK", 7782,TO_DATE("23-JAN-1982", "DD-MON-YYYY"), 1300, NULL, 10); 1 row created. SQL> SQL> SQL> select deptno, ename, sal, rn

 2  from (select deptno,ename,sal,
 3                 row_number() over (partition by deptno order by sal desc) rn,
 4                 rank() over (partition by deptno order by sal desc ) rank,
 5                 dense_rank() over ( partition by deptno order by sal desc ) dense_rank
 6          from emp)
 7  where rn <= 3
 8  order by deptno, sal DESC
 9  /
   DEPTNO ENAME             SAL         RN

---------- ---------- ----------
       10 KING             5000          1
          CLARK            2450          2
          MILLER           1300          3
       20 SCOTT            3000          1
          FORD             3000          2
          JONES            2975          3
       30 BLAKE            2850          1
          ALLEN            1600          2
          TURNER           1500          3

9 rows selected. SQL> SQL> drop table emp; Table dropped.


 </source>
   
  


RANK(): rank items, leaves a gap in the sequence when there is a tie

   <source lang="sql">

SQL> SQL> CREATE TABLE all_sales (

 2    year INTEGER,
 3    month INTEGER,
 4    prd_type_id INTEGER,
 5    emp_id INTEGER ,
 6    amount NUMBER(8, 2)
 7  );

Table created. SQL> SQL> insert into all_sales (YEAR,MONTH,PRD_TYPE_ID,EMP_ID,AMOUNT)

 2                  values(2006,1    ,1          ,21    ,16034.84);

1 row created. SQL> insert into all_sales (YEAR,MONTH,PRD_TYPE_ID,EMP_ID,AMOUNT)

 2                  values(2006,2    ,1          ,21    ,15644.65);

1 row created. SQL> insert into all_sales (YEAR,MONTH,PRD_TYPE_ID,EMP_ID,AMOUNT)

 2                  values(2006,3    ,2          ,21    ,20167.83);

1 row created. SQL> insert into all_sales (YEAR,MONTH,PRD_TYPE_ID,EMP_ID,AMOUNT)

 2                  values(2006,4    ,2          ,21    ,25056.45);

1 row created. SQL> insert into all_sales (YEAR,MONTH,PRD_TYPE_ID,EMP_ID,AMOUNT)

 2                  values(2006,5    ,2          ,21    ,NULL);

1 row created. SQL> insert into all_sales (YEAR,MONTH,PRD_TYPE_ID,EMP_ID,AMOUNT)

 2                  values(2006,6    ,1          ,21    ,15564.66);

1 row created. SQL> insert into all_sales (YEAR,MONTH,PRD_TYPE_ID,EMP_ID,AMOUNT)

 2                  values(2006,7    ,1          ,21    ,15644.65);

1 row created. SQL> insert into all_sales (YEAR,MONTH,PRD_TYPE_ID,EMP_ID,AMOUNT)

 2                  values(2006,8    ,1          ,21    ,16434.82);

1 row created. SQL> insert into all_sales (YEAR,MONTH,PRD_TYPE_ID,EMP_ID,AMOUNT)

 2                  values(2006,9    ,1          ,21    ,19654.57);

1 row created. SQL> insert into all_sales (YEAR,MONTH,PRD_TYPE_ID,EMP_ID,AMOUNT)

 2                  values(2006,10   ,1          ,21    ,21764.19);

1 row created. SQL> insert into all_sales (YEAR,MONTH,PRD_TYPE_ID,EMP_ID,AMOUNT)

 2                  values(2006,11   ,1          ,21    ,13026.73);

1 row created. SQL> insert into all_sales (YEAR,MONTH,PRD_TYPE_ID,EMP_ID,AMOUNT)

 2                  values(2006,12   ,2          ,21    ,10034.64);

1 row created. SQL> insert into all_sales (YEAR,MONTH,PRD_TYPE_ID,EMP_ID,AMOUNT)

 2                  values(2005,1    ,2          ,22    ,16634.84);

1 row created. SQL> insert into all_sales (YEAR,MONTH,PRD_TYPE_ID,EMP_ID,AMOUNT)

 2                  values(2005,1    ,2          ,21    ,26034.84);

1 row created. SQL> insert into all_sales (YEAR,MONTH,PRD_TYPE_ID,EMP_ID,AMOUNT)

 2                  values(2005,2    ,1          ,21    ,12644.65);

1 row created. SQL> insert into all_sales (YEAR,MONTH,PRD_TYPE_ID,EMP_ID,AMOUNT)

 2                  values(2005,3    ,1          ,21    ,NULL);

1 row created. SQL> insert into all_sales (YEAR,MONTH,PRD_TYPE_ID,EMP_ID,AMOUNT)

 2                  values(2005,4    ,1          ,21    ,25026.45);

1 row created. SQL> insert into all_sales (YEAR,MONTH,PRD_TYPE_ID,EMP_ID,AMOUNT)

 2                  values(2005,5    ,1          ,21    ,17212.66);

1 row created. SQL> insert into all_sales (YEAR,MONTH,PRD_TYPE_ID,EMP_ID,AMOUNT)

 2                  values(2005,6    ,1          ,21    ,15564.26);

1 row created. SQL> insert into all_sales (YEAR,MONTH,PRD_TYPE_ID,EMP_ID,AMOUNT)

 2                  values(2005,7    ,2          ,21    ,62654.82);

1 row created. SQL> insert into all_sales (YEAR,MONTH,PRD_TYPE_ID,EMP_ID,AMOUNT)

 2                  values(2005,8    ,2          ,21    ,26434.82);

1 row created. SQL> insert into all_sales (YEAR,MONTH,PRD_TYPE_ID,EMP_ID,AMOUNT)

 2                  values(2005,9    ,2          ,21    ,15644.65);

1 row created. SQL> insert into all_sales (YEAR,MONTH,PRD_TYPE_ID,EMP_ID,AMOUNT)

 2                  values(2005,10   ,2          ,21    ,21264.19);

1 row created. SQL> insert into all_sales (YEAR,MONTH,PRD_TYPE_ID,EMP_ID,AMOUNT)

 2                  values(2005,11   ,1          ,21    ,13026.73);

1 row created. SQL> insert into all_sales (YEAR,MONTH,PRD_TYPE_ID,EMP_ID,AMOUNT)

 2                  values(2005,12   ,1          ,21    ,10032.64);

1 row created. SQL> SQL> select * from all_sales;

     YEAR      MONTH PRD_TYPE_ID     EMP_ID     AMOUNT

---------- ----------- ---------- ----------
     2006          1           1         21   16034.84
     2006          2           1         21   15644.65
     2006          3           2         21   20167.83
     2006          4           2         21   25056.45
     2006          5           2         21
     2006          6           1         21   15564.66
     2006          7           1         21   15644.65
     2006          8           1         21   16434.82
     2006          9           1         21   19654.57
     2006         10           1         21   21764.19
     2006         11           1         21   13026.73
     2006         12           2         21   10034.64
     2005          1           2         22   16634.84
     2005          1           2         21   26034.84
     2005          2           1         21   12644.65
     2005          3           1         21
     2005          4           1         21   25026.45
     2005          5           1         21   17212.66
     2005          6           1         21   15564.26
     2005          7           2         21   62654.82
     2005          8           2         21   26434.82
     2005          9           2         21   15644.65
     2005         10           2         21   21264.19
     2005         11           1         21   13026.73
     2005         12           1         21   10032.64

25 rows selected. SQL> SQL> --RANK(): rank items, leaves a gap in the sequence when there is a tie SQL> SQL> SQL> SELECT

 2   prd_type_id, SUM(amount),
 3   RANK() OVER (ORDER BY SUM(amount) DESC) AS rank,
 4   DENSE_RANK() OVER (ORDER BY SUM(amount) DESC) AS dense_rank
 5  FROM all_sales
 6  WHERE amount IS NOT NULL
 7  GROUP BY prd_type_id
 8  ORDER BY prd_type_id;

PRD_TYPE_ID SUM(AMOUNT) RANK DENSE_RANK


----------- ---------- ----------
         1    227276.5          1          1
         2   223927.08          2          2

SQL> SQL> drop table all_sales; Table dropped. SQL> SQL>


 </source>
   
  


RANK() with NULLS FIRST

   <source lang="sql">

SQL> CREATE TABLE all_sales (

 2    year INTEGER,
 3    month INTEGER,
 4    prd_type_id INTEGER,
 5    emp_id INTEGER ,
 6    amount NUMBER(8, 2)
 7  );

Table created. SQL> SQL> insert into all_sales (YEAR,MONTH,PRD_TYPE_ID,EMP_ID,AMOUNT)

 2                  values(2006,1    ,1          ,21    ,16034.84);

1 row created. SQL> insert into all_sales (YEAR,MONTH,PRD_TYPE_ID,EMP_ID,AMOUNT)

 2                  values(2006,2    ,1          ,21    ,15644.65);

1 row created. SQL> insert into all_sales (YEAR,MONTH,PRD_TYPE_ID,EMP_ID,AMOUNT)

 2                  values(2006,3    ,2          ,21    ,20167.83);

1 row created. SQL> insert into all_sales (YEAR,MONTH,PRD_TYPE_ID,EMP_ID,AMOUNT)

 2                  values(2006,4    ,2          ,21    ,25056.45);

1 row created. SQL> insert into all_sales (YEAR,MONTH,PRD_TYPE_ID,EMP_ID,AMOUNT)

 2                  values(2006,5    ,2          ,21    ,NULL);

1 row created. SQL> insert into all_sales (YEAR,MONTH,PRD_TYPE_ID,EMP_ID,AMOUNT)

 2                  values(2006,6    ,1          ,21    ,15564.66);

1 row created. SQL> insert into all_sales (YEAR,MONTH,PRD_TYPE_ID,EMP_ID,AMOUNT)

 2                  values(2006,7    ,1          ,21    ,15644.65);

1 row created. SQL> insert into all_sales (YEAR,MONTH,PRD_TYPE_ID,EMP_ID,AMOUNT)

 2                  values(2006,8    ,1          ,21    ,NULL);

1 row created. SQL> insert into all_sales (YEAR,MONTH,PRD_TYPE_ID,EMP_ID,AMOUNT)

 2                  values(2006,9    ,1          ,21    ,19654.57);

1 row created. SQL> insert into all_sales (YEAR,MONTH,PRD_TYPE_ID,EMP_ID,AMOUNT)

 2                  values(2006,10   ,1          ,21    ,NULL);

1 row created. SQL> insert into all_sales (YEAR,MONTH,PRD_TYPE_ID,EMP_ID,AMOUNT)

 2                  values(2006,11   ,1          ,21    ,13026.73);

1 row created. SQL> insert into all_sales (YEAR,MONTH,PRD_TYPE_ID,EMP_ID,AMOUNT)

 2                  values(2006,12   ,2          ,21    ,10034.64);

1 row created. SQL> insert into all_sales (YEAR,MONTH,PRD_TYPE_ID,EMP_ID,AMOUNT)

 2                  values(2005,1    ,2          ,22    ,16634.84);

1 row created. SQL> insert into all_sales (YEAR,MONTH,PRD_TYPE_ID,EMP_ID,AMOUNT)

 2                  values(2005,1    ,2          ,21    ,26034.84);

1 row created. SQL> insert into all_sales (YEAR,MONTH,PRD_TYPE_ID,EMP_ID,AMOUNT)

 2                  values(2005,2    ,1          ,21    ,12644.65);

1 row created. SQL> insert into all_sales (YEAR,MONTH,PRD_TYPE_ID,EMP_ID,AMOUNT)

 2                  values(2005,3    ,1          ,21    ,NULL);

1 row created. SQL> insert into all_sales (YEAR,MONTH,PRD_TYPE_ID,EMP_ID,AMOUNT)

 2                  values(2005,4    ,1          ,21    ,25026.45);

1 row created. SQL> insert into all_sales (YEAR,MONTH,PRD_TYPE_ID,EMP_ID,AMOUNT)

 2                  values(2005,5    ,1          ,21    ,17212.66);

1 row created. SQL> insert into all_sales (YEAR,MONTH,PRD_TYPE_ID,EMP_ID,AMOUNT)

 2                  values(2005,6    ,1          ,21    ,15564.26);

1 row created. SQL> insert into all_sales (YEAR,MONTH,PRD_TYPE_ID,EMP_ID,AMOUNT)

 2                  values(2005,7    ,2          ,21    ,62654.82);

1 row created. SQL> insert into all_sales (YEAR,MONTH,PRD_TYPE_ID,EMP_ID,AMOUNT)

 2                  values(2005,8    ,2          ,21    ,26434.82);

1 row created. SQL> insert into all_sales (YEAR,MONTH,PRD_TYPE_ID,EMP_ID,AMOUNT)

 2                  values(2005,9    ,2          ,21    ,15644.65);

1 row created. SQL> insert into all_sales (YEAR,MONTH,PRD_TYPE_ID,EMP_ID,AMOUNT)

 2                  values(2005,10   ,2          ,21    ,21264.19);

1 row created. SQL> insert into all_sales (YEAR,MONTH,PRD_TYPE_ID,EMP_ID,AMOUNT)

 2                  values(2005,11   ,1          ,21    ,13026.73);

1 row created. SQL> insert into all_sales (YEAR,MONTH,PRD_TYPE_ID,EMP_ID,AMOUNT)

 2                  values(2005,12   ,1          ,21    ,10032.64);

1 row created. SQL> SQL> select * from all_sales;

     YEAR      MONTH PRD_TYPE_ID     EMP_ID     AMOUNT

---------- ----------- ---------- ----------
     2006          1           1         21   16034.84
     2006          2           1         21   15644.65
     2006          3           2         21   20167.83
     2006          4           2         21   25056.45
     2006          5           2         21
     2006          6           1         21   15564.66
     2006          7           1         21   15644.65
     2006          8           1         21
     2006          9           1         21   19654.57
     2006         10           1         21
     2006         11           1         21   13026.73
     2006         12           2         21   10034.64
     2005          1           2         22   16634.84
     2005          1           2         21   26034.84
     2005          2           1         21   12644.65
     2005          3           1         21
     2005          4           1         21   25026.45
     2005          5           1         21   17212.66
     2005          6           1         21   15564.26
     2005          7           2         21   62654.82
     2005          8           2         21   26434.82
     2005          9           2         21   15644.65
     2005         10           2         21   21264.19
     2005         11           1         21   13026.73
     2005         12           1         21   10032.64

25 rows selected. SQL> SQL> --RANK() with NULLS FIRST SQL> SQL> SELECT

 2   prd_type_id, SUM(amount),
 3   RANK() OVER (ORDER BY SUM(amount) DESC NULLS FIRST) AS rank
 4  FROM all_sales
 5  GROUP BY prd_type_id
 6  ORDER BY prd_type_id;

PRD_TYPE_ID SUM(AMOUNT) RANK


----------- ----------
         1   189077.49          2
         2   223927.08          1

SQL> SQL> drop table all_sales; Table dropped. SQL> SQL>


 </source>
   
  


RANK() with NULLS LAST demo

   <source lang="sql">

SQL> CREATE TABLE all_sales (

 2    year INTEGER,
 3    month INTEGER,
 4    prd_type_id INTEGER,
 5    emp_id INTEGER ,
 6    amount NUMBER(8, 2)
 7  );

Table created. SQL> SQL> insert into all_sales (YEAR,MONTH,PRD_TYPE_ID,EMP_ID,AMOUNT)

 2                  values(2006,1    ,1          ,21    ,16034.84);

1 row created. SQL> insert into all_sales (YEAR,MONTH,PRD_TYPE_ID,EMP_ID,AMOUNT)

 2                  values(2006,2    ,1          ,21    ,15644.65);

1 row created. SQL> insert into all_sales (YEAR,MONTH,PRD_TYPE_ID,EMP_ID,AMOUNT)

 2                  values(2006,3    ,2          ,21    ,20167.83);

1 row created. SQL> insert into all_sales (YEAR,MONTH,PRD_TYPE_ID,EMP_ID,AMOUNT)

 2                  values(2006,4    ,2          ,21    ,25056.45);

1 row created. SQL> insert into all_sales (YEAR,MONTH,PRD_TYPE_ID,EMP_ID,AMOUNT)

 2                  values(2006,5    ,2          ,21    ,NULL);

1 row created. SQL> insert into all_sales (YEAR,MONTH,PRD_TYPE_ID,EMP_ID,AMOUNT)

 2                  values(2006,6    ,1          ,21    ,15564.66);

1 row created. SQL> insert into all_sales (YEAR,MONTH,PRD_TYPE_ID,EMP_ID,AMOUNT)

 2                  values(2006,7    ,1          ,21    ,15644.65);

1 row created. SQL> insert into all_sales (YEAR,MONTH,PRD_TYPE_ID,EMP_ID,AMOUNT)

 2                  values(2006,8    ,1          ,21    ,16434.82);

1 row created. SQL> insert into all_sales (YEAR,MONTH,PRD_TYPE_ID,EMP_ID,AMOUNT)

 2                  values(2006,9    ,1          ,21    ,19654.57);

1 row created. SQL> insert into all_sales (YEAR,MONTH,PRD_TYPE_ID,EMP_ID,AMOUNT)

 2                  values(2006,10   ,1          ,21    ,21764.19);

1 row created. SQL> insert into all_sales (YEAR,MONTH,PRD_TYPE_ID,EMP_ID,AMOUNT)

 2                  values(2006,11   ,1          ,21    ,13026.73);

1 row created. SQL> insert into all_sales (YEAR,MONTH,PRD_TYPE_ID,EMP_ID,AMOUNT)

 2                  values(2006,12   ,2          ,21    ,10034.64);

1 row created. SQL> insert into all_sales (YEAR,MONTH,PRD_TYPE_ID,EMP_ID,AMOUNT)

 2                  values(2005,1    ,2          ,22    ,16634.84);

1 row created. SQL> insert into all_sales (YEAR,MONTH,PRD_TYPE_ID,EMP_ID,AMOUNT)

 2                  values(2005,1    ,2          ,21    ,26034.84);

1 row created. SQL> insert into all_sales (YEAR,MONTH,PRD_TYPE_ID,EMP_ID,AMOUNT)

 2                  values(2005,2    ,1          ,21    ,12644.65);

1 row created. SQL> insert into all_sales (YEAR,MONTH,PRD_TYPE_ID,EMP_ID,AMOUNT)

 2                  values(2005,3    ,1          ,21    ,NULL);

1 row created. SQL> insert into all_sales (YEAR,MONTH,PRD_TYPE_ID,EMP_ID,AMOUNT)

 2                  values(2005,4    ,1          ,21    ,25026.45);

1 row created. SQL> insert into all_sales (YEAR,MONTH,PRD_TYPE_ID,EMP_ID,AMOUNT)

 2                  values(2005,5    ,1          ,21    ,17212.66);

1 row created. SQL> insert into all_sales (YEAR,MONTH,PRD_TYPE_ID,EMP_ID,AMOUNT)

 2                  values(2005,6    ,1          ,21    ,15564.26);

1 row created. SQL> insert into all_sales (YEAR,MONTH,PRD_TYPE_ID,EMP_ID,AMOUNT)

 2                  values(2005,7    ,2          ,21    ,62654.82);

1 row created. SQL> insert into all_sales (YEAR,MONTH,PRD_TYPE_ID,EMP_ID,AMOUNT)

 2                  values(2005,8    ,2          ,21    ,26434.82);

1 row created. SQL> insert into all_sales (YEAR,MONTH,PRD_TYPE_ID,EMP_ID,AMOUNT)

 2                  values(2005,9    ,2          ,21    ,15644.65);

1 row created. SQL> insert into all_sales (YEAR,MONTH,PRD_TYPE_ID,EMP_ID,AMOUNT)

 2                  values(2005,10   ,2          ,21    ,21264.19);

1 row created. SQL> insert into all_sales (YEAR,MONTH,PRD_TYPE_ID,EMP_ID,AMOUNT)

 2                  values(2005,11   ,1          ,21    ,13026.73);

1 row created. SQL> insert into all_sales (YEAR,MONTH,PRD_TYPE_ID,EMP_ID,AMOUNT)

 2                  values(2005,12   ,1          ,21    ,10032.64);

1 row created. SQL> SQL> select * from all_sales;

     YEAR      MONTH PRD_TYPE_ID     EMP_ID     AMOUNT

---------- ----------- ---------- ----------
     2006          1           1         21   16034.84
     2006          2           1         21   15644.65
     2006          3           2         21   20167.83
     2006          4           2         21   25056.45
     2006          5           2         21
     2006          6           1         21   15564.66
     2006          7           1         21   15644.65
     2006          8           1         21   16434.82
     2006          9           1         21   19654.57
     2006         10           1         21   21764.19
     2006         11           1         21   13026.73
     2006         12           2         21   10034.64
     2005          1           2         22   16634.84
     2005          1           2         21   26034.84
     2005          2           1         21   12644.65
     2005          3           1         21
     2005          4           1         21   25026.45
     2005          5           1         21   17212.66
     2005          6           1         21   15564.26
     2005          7           2         21   62654.82
     2005          8           2         21   26434.82
     2005          9           2         21   15644.65
     2005         10           2         21   21264.19
     2005         11           1         21   13026.73
     2005         12           1         21   10032.64

25 rows selected. SQL> SQL> --RANK() with NULLS LAST SQL> SQL> SELECT

 2   prd_type_id, SUM(amount),
 3   RANK() OVER (ORDER BY SUM(amount) DESC NULLS LAST) AS rank
 4  FROM all_sales
 5  GROUP BY prd_type_id
 6  ORDER BY prd_type_id;

PRD_TYPE_ID SUM(AMOUNT) RANK


----------- ----------
         1    227276.5          1
         2   223927.08          2

SQL> SQL> drop table all_sales; Table dropped. SQL> SQL>


 </source>
   
  


Rank() with null values

   <source lang="sql">

SQL> SQL> -- create demo table SQL> create table Employee(

 2    empno              Number(3)  NOT NULL, -- Employee ID
 3    ename              VARCHAR2(10 BYTE),   -- Employee Name
 4    hireDate          DATE,                -- Date Employee Hired
 5    orig_salary        Number(8,2),         -- Orignal Salary
 6    curr_salary        Number(8,2),         -- Current Salary
 7    region             VARCHAR2(1 BYTE)     -- Region where employeed
 8  )
 9  /

Table created. SQL> SQL> SQL> -- prepare data for employee table SQL> insert into Employee(empno, ename, hireDate, orig_salary, curr_salary, region)

 2                values(122,"Alison",to_date("19960321","YYYYMMDD"), 45000,       NULL,       "E")
 3  /

1 row created. SQL> insert into Employee(empno, ename, hireDate, orig_salary, curr_salary, region)

 2                values(123, "James",to_date("19781212","YYYYMMDD"), 23000,       32000,       "W")
 3  /

1 row created. SQL> insert into Employee(empno, ename, hireDate, orig_salary, curr_salary, region)

 2                values(104,"Celia",to_date("19821024","YYYYMMDD"), NULL,       58000,        "E")
 3  /

1 row created. SQL> insert into Employee(empno, ename, hireDate, orig_salary, curr_salary, region)

 2                values(105,"Robert",to_date("19840115","YYYYMMDD"), 31000,      NULL,        "W")
 3  /

1 row created. SQL> insert into Employee(empno, ename, hireDate, orig_salary, curr_salary, region)

 2                values(116,"Linda", to_date("19870730","YYYYMMDD"), NULL,       53000,       "E")
 3  /

1 row created. SQL> insert into Employee(empno, ename, hireDate, orig_salary, curr_salary, region)

 2                values(117,"David", to_date("19901231","YYYYMMDD"), 78000,       NULL,       "W")
 3  /

1 row created. SQL> insert into Employee(empno, ename, hireDate, orig_salary, curr_salary, region)

 2                values(108,"Jode",  to_date("19960917","YYYYMMDD"), 21000,       29000,       "E")
 3  /

1 row created. SQL> SQL> -- display data in the table SQL> select * from Employee

 2  /

Hit a key to continue

    EMPNO ENAME      HIREDATE  ORIG_SALARY CURR_SALARY R

---------- --------- ----------- ----------- -
      122 Alison     21-MAR-96       45000             E
      123 James      12-DEC-78       23000       32000 W
      104 Celia      24-OCT-82                   58000 E
      105 Robert     15-JAN-84       31000             W
      116 Linda      30-JUL-87                   53000 E
      117 David      31-DEC-90       78000             W
      108 Jode       17-SEP-96       21000       29000 E

7 rows selected. SQL> SQL> SQL> -- With nulls: SQL> SQL> SELECT empno, ename, curr_salary,

 2    ROW_NUMBER() OVER(ORDER BY curr_salary) salary
 3  FROM Employee
 4  ORDER BY curr_salary;

Hit a key to continue

    EMPNO ENAME      CURR_SALARY     SALARY

---------- ----------- ----------
      108 Jode             29000          1
      123 James            32000          2
      116 Linda            53000          3
      104 Celia            58000          4
      117 David                           5
      122 Alison                          6
      105 Robert                          7

7 rows selected. SQL> SQL> SQL> -- clean the table SQL> drop table Employee; Table dropped. SQL> SQL>


 </source>
   
  


Rank with order by clause

   <source lang="sql">

SQL> SQL> -- create demo table SQL> create table Employee(

 2    ID                 VARCHAR2(4 BYTE)         NOT NULL,
 3    First_Name         VARCHAR2(20 BYTE),
 4    Last_Name          VARCHAR2(20 BYTE),
 5    Start_Date         DATE,
 6    End_Date           DATE,
 7    Salary             Number(8,2),
 8    City               VARCHAR2(20 BYTE),
 9    Description        VARCHAR2(80 BYTE)
10  )
11  /

Table created. SQL> SQL> -- prepare data SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date, End_Date, Salary, City, Description)

 2               values ("01","Jason",    "Martin",  to_date("19960725","YYYYMMDD"), to_date("20060725","YYYYMMDD"), 1234.56, "Toronto",  "Programmer")
 3  /

1 row created. SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date, End_Date, Salary, City, Description)

 2                values("02","Alison",   "Mathews", to_date("19760321","YYYYMMDD"), to_date("19860221","YYYYMMDD"), 2234.78, "Vancouver","Tester")
 3  /

1 row created. SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date, End_Date, Salary, City, Description)

 2                values("03","James",    "Smith",   to_date("19781212","YYYYMMDD"), to_date("19900315","YYYYMMDD"), 2324.78, "Vancouver","Tester")
 3  /

1 row created. SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date, End_Date, Salary, City, Description)

 2                values("04","Celia",    "Rice",    to_date("19821024","YYYYMMDD"), to_date("19990421","YYYYMMDD"), 3334.78, "Vancouver","Manager")
 3  /

1 row created. SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date, End_Date, Salary, City, Description)

 2                values("05","Robert",   "Black",   to_date("19840115","YYYYMMDD"), to_date("19980808","YYYYMMDD"), 4334.78, "Vancouver","Tester")
 3  /

1 row created. SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date, End_Date, Salary, City, Description)

 2                values("06","Linda",    "Green",   to_date("19870730","YYYYMMDD"), to_date("19960104","YYYYMMDD"), 5334.78,"New York",  "Tester")
 3  /

1 row created. SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date, End_Date, Salary, City, Description)

 2                values("07","David",    "Larry",   to_date("19901231","YYYYMMDD"), to_date("19980212","YYYYMMDD"), 6334.78,"New York",  "Manager")
 3  /

1 row created. SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date, End_Date, Salary, City, Description)

 2                values("08","James",    "Cat",     to_date("19960917","YYYYMMDD"), to_date("20020415","YYYYMMDD"), 7334.78,"Vancouver", "Tester")
 3  /

1 row created. SQL> SQL> SQL> SQL> -- display data in the table SQL> select * from Employee

 2  /

ID FIRST_NAME LAST_NAME START_DAT END_DATE SALARY CITY DESCRIPTION


-------------------- -------------------- --------- --------- ---------- -------------------- --------------------------------------------------------------------------------

01 Jason Martin 25-JUL-96 25-JUL-06 1234.56 Toronto Programmer 02 Alison Mathews 21-MAR-76 21-FEB-86 2234.78 Vancouver Tester 03 James Smith 12-DEC-78 15-MAR-90 2324.78 Vancouver Tester 04 Celia Rice 24-OCT-82 21-APR-99 3334.78 Vancouver Manager 05 Robert Black 15-JAN-84 08-AUG-98 4334.78 Vancouver Tester 06 Linda Green 30-JUL-87 04-JAN-96 5334.78 New York Tester 07 David Larry 31-DEC-90 12-FEB-98 6334.78 New York Manager 08 James Cat 17-SEP-96 15-APR-02 7334.78 Vancouver Tester 8 rows selected. SQL> SQL> SQL> SELECT id, first_name, salary,

 2    RANK() OVER(ORDER BY salary)
 3  FROM employee
 4  WHERE salary > 3800
 5  ORDER BY salary;

ID FIRST_NAME SALARY RANK()OVER(ORDERBYSALARY)


-------------------- ---------- -------------------------

05 Robert 4334.78 1 06 Linda 5334.78 2 07 David 6334.78 3 08 James 7334.78 4 SQL> SQL> SQL> SQL> -- clean the table SQL> drop table Employee

 2  /

Table dropped. SQL> SQL>


 </source>
   
  


The ranking as opposed to a row-numbering problem (the problem of ties)

   <source lang="sql">

SQL> SQL> -- create demo table SQL> create table Employee(

 2    ID                 VARCHAR2(4 BYTE)         NOT NULL,
 3    First_Name         VARCHAR2(10 BYTE),
 4    Last_Name          VARCHAR2(10 BYTE),
 5    Start_Date         DATE,
 6    End_Date           DATE,
 7    Salary             Number(8,2),
 8    City               VARCHAR2(10 BYTE),
 9    Description        VARCHAR2(15 BYTE)
10  )
11  /

Table created. SQL> SQL> -- prepare data SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date, End_Date, Salary, City, Description)

 2               values ("01","Jason",    "Martin",  to_date("19960725","YYYYMMDD"), to_date("20060725","YYYYMMDD"), 1234.56, "Toronto",  "Programmer")
 3  /

1 row created. SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date, End_Date, Salary, City, Description)

 2                values("02","Alison",   "Mathews", to_date("19760321","YYYYMMDD"), to_date("19860221","YYYYMMDD"), 2334.78, "Vancouver","Tester")
 3  /

1 row created. SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date, End_Date, Salary, City, Description)

 2                values("03","James",    "Smith",   to_date("19781212","YYYYMMDD"), to_date("19900315","YYYYMMDD"), 2334.78, "Vancouver","Tester")
 3  /

1 row created. SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date, End_Date, Salary, City, Description)

 2                values("04","Celia",    "Rice",    to_date("19821024","YYYYMMDD"), to_date("19990421","YYYYMMDD"), 2334.78, "Vancouver","Manager")
 3  /

1 row created. SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date, End_Date, Salary, City, Description)

 2                values("05","Robert",   "Black",   to_date("19840115","YYYYMMDD"), to_date("19980808","YYYYMMDD"), 2334.78, "Vancouver","Tester")
 3  /

1 row created. SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date, End_Date, Salary, City, Description)

 2                values("06","Linda",    "Green",   to_date("19870730","YYYYMMDD"), to_date("19960104","YYYYMMDD"), 2334.78,"New York",  "Tester")
 3  /

1 row created. SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date, End_Date, Salary, City, Description)

 2                values("07","David",    "Larry",   to_date("19901231","YYYYMMDD"), to_date("19980212","YYYYMMDD"), 2334.78,"New York",  "Manager")
 3  /

1 row created. SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date, End_Date, Salary, City, Description)

 2                values("08","James",    "Cat",     to_date("19960917","YYYYMMDD"), to_date("20020415","YYYYMMDD"), 2334.78,"Vancouver", "Tester")
 3  /

1 row created. SQL> SQL> SQL> SQL> -- display data in the table SQL> select * from Employee

 2  /

ID FIRST_NAME LAST_NAME START_DAT END_DATE SALARY CITY DESCRIPTION


---------- ---------- --------- --------- ---------- ---------- ---------------

01 Jason Martin 25-JUL-96 25-JUL-06 1234.56 Toronto Programmer 02 Alison Mathews 21-MAR-76 21-FEB-86 2334.78 Vancouver Tester 03 James Smith 12-DEC-78 15-MAR-90 2334.78 Vancouver Tester 04 Celia Rice 24-OCT-82 21-APR-99 2334.78 Vancouver Manager 05 Robert Black 15-JAN-84 08-AUG-98 2334.78 Vancouver Tester 06 Linda Green 30-JUL-87 04-JAN-96 2334.78 New York Tester 07 David Larry 31-DEC-90 12-FEB-98 2334.78 New York Manager 08 James Cat 17-SEP-96 15-APR-02 2334.78 Vancouver Tester 8 rows selected. SQL> SQL> -- the ranking as opposed to a row-numbering problem (the problem of ties), SQL> SQL> SELECT id, first_name, salary,

 2    RANK() OVER(ORDER BY salary desc) toprank
 3  FROM employee;

ID FIRST_NAME SALARY TOPRANK


---------- ---------- ----------

04 Celia 2334.78 1 02 Alison 2334.78 1 03 James 2334.78 1 08 James 2334.78 1 05 Robert 2334.78 1 06 Linda 2334.78 1 07 David 2334.78 1 01 Jason 1234.56 8 8 rows selected. SQL> SQL> SQL> SQL> SQL> -- clean the table SQL> drop table Employee; Table dropped. SQL> SQL> SQL>


 </source>
   
  


The WHERE is applied before the RANK()

   <source lang="sql">

SQL> SQL> -- create demo table SQL> create table Employee(

 2    ID                 VARCHAR2(4 BYTE)         NOT NULL,
 3    First_Name         VARCHAR2(20 BYTE),
 4    Last_Name          VARCHAR2(20 BYTE),
 5    Start_Date         DATE,
 6    End_Date           DATE,
 7    Salary             Number(8,2),
 8    City               VARCHAR2(20 BYTE),
 9    Description        VARCHAR2(80 BYTE)
10  )
11  /

Table created. SQL> SQL> -- prepare data SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date, End_Date, Salary, City, Description)

 2               values ("01","Jason",    "Martin",  to_date("19960725","YYYYMMDD"), to_date("20060725","YYYYMMDD"), 1234.56, "Toronto",  "Programmer")
 3  /

1 row created. SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date, End_Date, Salary, City, Description)

 2                values("02","Alison",   "Mathews", to_date("19760321","YYYYMMDD"), to_date("19860221","YYYYMMDD"), 2234.78, "Vancouver","Tester")
 3  /

1 row created. SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date, End_Date, Salary, City, Description)

 2                values("03","James",    "Smith",   to_date("19781212","YYYYMMDD"), to_date("19900315","YYYYMMDD"), 2324.78, "Vancouver","Tester")
 3  /

1 row created. SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date, End_Date, Salary, City, Description)

 2                values("04","Celia",    "Rice",    to_date("19821024","YYYYMMDD"), to_date("19990421","YYYYMMDD"), 3334.78, "Vancouver","Manager")
 3  /

1 row created. SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date, End_Date, Salary, City, Description)

 2                values("05","Robert",   "Black",   to_date("19840115","YYYYMMDD"), to_date("19980808","YYYYMMDD"), 4334.78, "Vancouver","Tester")
 3  /

1 row created. SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date, End_Date, Salary, City, Description)

 2                values("06","Linda",    "Green",   to_date("19870730","YYYYMMDD"), to_date("19960104","YYYYMMDD"), 5334.78,"New York",  "Tester")
 3  /

1 row created. SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date, End_Date, Salary, City, Description)

 2                values("07","David",    "Larry",   to_date("19901231","YYYYMMDD"), to_date("19980212","YYYYMMDD"), 6334.78,"New York",  "Manager")
 3  /

1 row created. SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date, End_Date, Salary, City, Description)

 2                values("08","James",    "Cat",     to_date("19960917","YYYYMMDD"), to_date("20020415","YYYYMMDD"), 7334.78,"Vancouver", "Tester")
 3  /

1 row created. SQL> SQL> SQL> SQL> -- display data in the table SQL> select * from Employee

 2  /

ID FIRST_NAME LAST_NAME START_DAT END_DATE SALARY CITY DESCRIPTION


-------------------- -------------------- --------- --------- ---------- -------------------- --------------------------------------------------------------------------------

01 Jason Martin 25-JUL-96 25-JUL-06 1234.56 Toronto Programmer 02 Alison Mathews 21-MAR-76 21-FEB-86 2234.78 Vancouver Tester 03 James Smith 12-DEC-78 15-MAR-90 2324.78 Vancouver Tester 04 Celia Rice 24-OCT-82 21-APR-99 3334.78 Vancouver Manager 05 Robert Black 15-JAN-84 08-AUG-98 4334.78 Vancouver Tester 06 Linda Green 30-JUL-87 04-JAN-96 5334.78 New York Tester 07 David Larry 31-DEC-90 12-FEB-98 6334.78 New York Manager 08 James Cat 17-SEP-96 15-APR-02 7334.78 Vancouver Tester 8 rows selected. SQL> SQL> SQL> -- the WHERE is applied before the RANK(). SQL> SQL> SELECT id, first_name, salary,

 2    RANK() OVER(ORDER BY salary) rankorder FROM employee
 3  WHERE salary < 43000
 4  ORDER BY salary;

ID FIRST_NAME SALARY RANKORDER


-------------------- ---------- ----------

01 Jason 1234.56 1 02 Alison 2234.78 2 03 James 2324.78 3 04 Celia 3334.78 4 05 Robert 4334.78 5 06 Linda 5334.78 6 07 David 6334.78 7 08 James 7334.78 8 8 rows selected. SQL> SQL> SQL> SQL> SQL> -- clean the table SQL> drop table Employee

 2  /

Table dropped. SQL> SQL> SQL>


 </source>
   
  


When RANK() is added to the statement, the RANK function is applied last, just before the ordering

   <source lang="sql">

SQL> SQL> -- create demo table SQL> create table Employee(

 2    empno              Number(3)  NOT NULL, -- Employee ID
 3    ename              VARCHAR2(10 BYTE),   -- Employee Name
 4    hireDate          DATE,                -- Date Employee Hired
 5    orig_salary        Number(8,2),         -- Orignal Salary
 6    curr_salary        Number(8,2),         -- Current Salary
 7    region             VARCHAR2(1 BYTE)     -- Region where employeed
 8  )
 9  /

Table created. SQL> SQL> create table job(

 2    empno              Number(3)  NOT NULL, -- Employee ID
 3    jobtitle           VARCHAR2(10 BYTE)    -- Employee job title
 4  )
 5  /

Table created. SQL> -- prepare data for employee table SQL> insert into Employee(empno, ename, hireDate, orig_salary, curr_salary, region)

 2                values(122,"Alison",to_date("19960321","YYYYMMDD"), 45000,       48000,       "E")
 3  /

1 row created. SQL> insert into Employee(empno, ename, hireDate, orig_salary, curr_salary, region)

 2                values(123, "James",to_date("19781212","YYYYMMDD"), 23000,       32000,       "W")
 3  /

1 row created. SQL> insert into Employee(empno, ename, hireDate, orig_salary, curr_salary, region)

 2                values(104,"Celia",to_date("19821024","YYYYMMDD"), 53000,       58000,        "E")
 3  /

1 row created. SQL> insert into Employee(empno, ename, hireDate, orig_salary, curr_salary, region)

 2                values(105,"Robert",to_date("19840115","YYYYMMDD"), 31000,      36000,        "W")
 3  /

1 row created. SQL> insert into Employee(empno, ename, hireDate, orig_salary, curr_salary, region)

 2                values(116,"Linda", to_date("19870730","YYYYMMDD"), 43000,       53000,       "E")
 3  /

1 row created. SQL> insert into Employee(empno, ename, hireDate, orig_salary, curr_salary, region)

 2                values(117,"David", to_date("19901231","YYYYMMDD"), 78000,       85000,       "W")
 3  /

1 row created. SQL> insert into Employee(empno, ename, hireDate, orig_salary, curr_salary, region)

 2                values(108,"Jode",  to_date("19960917","YYYYMMDD"), 21000,       29000,       "E")
 3  /

1 row created. SQL> SQL> -- prepare data for job table SQL> SQL> insert into job(empno, jobtitle)

 2           values(101,   "Painter");

1 row created. SQL> SQL> insert into job(empno, jobtitle)

 2           values(122,   "Tester");

1 row created. SQL> SQL> insert into job(empno, jobtitle)

 2           values(123,   "Dediator");

1 row created. SQL> SQL> insert into job(empno, jobtitle)

 2           values(104,   "Chemist");

1 row created. SQL> SQL> insert into job(empno, jobtitle)

 2           values(105,   "Accountant");

1 row created. SQL> SQL> insert into job(empno, jobtitle)

 2           values(116,   "Manager");

1 row created. SQL> SQL> insert into job(empno, jobtitle)

 2           values(117,   "Programmer");

1 row created. SQL> SQL> insert into job(empno, jobtitle)

 2           values(108,   "Developer");

1 row created. SQL> SQL> SQL> -- display data in the table SQL> select * from Employee

 2  /

Hit a key to continue

    EMPNO ENAME      HIREDATE  ORIG_SALARY CURR_SALARY R

---------- --------- ----------- ----------- -
      122 Alison     21-MAR-96       45000       48000 E
      123 James      12-DEC-78       23000       32000 W
      104 Celia      24-OCT-82       53000       58000 E
      105 Robert     15-JAN-84       31000       36000 W
      116 Linda      30-JUL-87       43000       53000 E
      117 David      31-DEC-90       78000       85000 W
      108 Jode       17-SEP-96       21000       29000 E

7 rows selected. SQL> select * from job; Hit a key to continue

    EMPNO JOBTITLE

----------
      101 Painter
      122 Tester
      123 Dediator
      104 Chemist
      105 Accountant
      116 Manager
      117 Programmer
      108 Developer

8 rows selected. SQL> SQL> -- When RANK() is added to the statement, the RANK function is applied last, SQL> -- just before the ordering: SQL> SQL> SELECT j.jobtitle, COUNT(*),

 2    MAX(orig_salary) maxsalary,
 3    MIN(orig_salary) minsalary,
 4    RANK() OVER(ORDER BY MAX(orig_salary)) rankorder
 5  FROM employee e, job j
 6  WHERE e.orig_salary < 43000
 7    AND e.empno = j.empno
 8  GROUP BY j.jobtitle
 9  ORDER BY rankorder;

Hit a key to continue JOBTITLE COUNT(*) MAXSALARY MINSALARY RANKORDER


---------- ---------- ---------- ----------

Developer 1 21000 21000 1 Dediator 1 23000 23000 2 Accountant 1 31000 31000 3 SQL> SQL> SQL> SQL> drop table job; Table dropped. SQL> SQL> -- clean the table SQL> drop table Employee; Table dropped. SQL> SQL> SQL>


 </source>