select name,class,s,rank()over(partition by class order by s desc) mm from tableA;
这条sql语句里很多函数以前都没用过,比如 rank() over() partition by ,网上查了说是聚合函数和分析函数,但确实没搞明白都是怎么用的,都用来干什么的。
谁帮我解释下,最好举个小例子, 谢谢了~~

解决方案 »

  1.   

    --查看雇员表数据
    SQL> select * from emp;     EMPNO ENAME      JOB              MGR HIREDATE                   SAL       COMM     DEPTNO
    ---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------
          7369 SMITH      CLERK           7902 1980-12-17 00:00:00        800                    20
          7499 ALLEN      SALESMAN        7698 1981-02-20 00:00:00       1600        300         30
          7521 WARD       SALESMAN        7698 1981-02-22 00:00:00       1250        500         30
          7566 JONES      MANAGER         7839 1981-04-02 00:00:00       2975                    20
          7654 MARTIN     SALESMAN        7698 1981-09-28 00:00:00       1250       1400         30
          7698 BLAKE      MANAGER         7839 1981-05-01 00:00:00       2850                    30
          7782 CLARK      MANAGER         7839 1981-06-09 00:00:00       2450                    10
          7788 SCOTT      ANALYST         7566 1987-04-19 00:00:00       3000                    20
          7839 KING       PRESIDENT            1981-11-17 00:00:00       5000                    10
          7844 TURNER     SALESMAN        7698 1981-09-08 00:00:00       1500          0         30
          7876 ADAMS      CLERK           7788 1987-05-23 00:00:00       1100                    20
          7900 JAMES      CLERK           7698 1981-12-03 00:00:00        950                    30
          7902 FORD       ANALYST         7566 1981-12-03 00:00:00       3000                    20
          7934 MILLER     CLERK           7782 1982-01-23 00:00:00       1300                    10已选择14行。--按照部门内薪水从高到低排名次
    SQL> SELECT t.empno  员工号,
      2         t.ename  姓名,
      3         t.deptno 部门号,
      4         t.sal    薪水,
      5         dense_rank() over(PARTITION BY t.deptno ORDER BY t.sal DESC) 名次
      6    FROM emp t;    员工号 姓名           部门号       薪水       名次
    ---------- ---------- ---------- ---------- ----------
          7839 KING               10       5000          1
          7782 CLARK              10       2450          2
          7934 MILLER             10       1300          3
          
          7788 SCOTT              20       3000          1
          7902 FORD               20       3000          1
          7566 JONES              20       2975          2
          7876 ADAMS              20       1100          3
          7369 SMITH              20        800          4
          
          7698 BLAKE              30       2850          1
          7499 ALLEN              30       1600          2
          7844 TURNER             30       1500          3
          7654 MARTIN             30       1250          4
          7521 WARD               30       1250          4
          7900 JAMES              30        950          5已选择14行。
    dense_rank() --排名分析函数
    over (PARTITION BY t.deptno --按部门分组
    ORDER BY t.sal DESC --按薪水排降序)
      

  2.   

    rank() 分析函数:计算一个值在一组值中的排位,排位是以1开始的连续整数,具有相等的值的行排位相同。
      

  3.   


    --他们都是评级函数:
    rank() over (partition by deptno order by sal)
    --在遇到相等的排名时,会在名次中留下空位:
    JAMES      CLERK        950.00     30          1
    WARD       SALESMAN    1250.00     30          2--第二名
    MARTIN     SALESMAN    1250.00     30          2--第二名
    TURNER     SALESMAN    1500.00     30          4--第四名
    ALLEN      SALESMAN    1600.00     30          5
    BLAKE      MANAGER     2850.00     30          6
    --
    dense_rank() over (partition by deptno order by sal)
    --在遇到相同的排名时,不留下空位:
    JAMES      CLERK        950.00     30          1
    WARD       SALESMAN    1250.00     30          2--第二名
    MARTIN     SALESMAN    1250.00     30          2--第二名
    TURNER     SALESMAN    1500.00     30          3--第三名
    ALLEN      SALESMAN    1600.00     30          4
    BLAKE      MANAGER     2850.00     30          5--你可以使用row_number()为每一个小分组返回一个行号,而不管具体的相等情况,
    --也就是查询到谁再前面就谁先排序
    SQL> select ename,job,sal,deptno,
      2         row_number() over (partition by deptno order by sal) rk
      3  from emp;
     
    ENAME      JOB             SAL DEPTNO         RK
    ---------- --------- --------- ------ ----------
    MILLER     CLERK       1300.00     10          1
    CLARK      MANAGER     2450.00     10          2
    KING       PRESIDENT   5000.00     10          3SMITH      CLERK        800.00     20          1
    ADAMS      CLERK       1100.00     20          2
    JONES      MANAGER     2975.00     20          3
    FORD       ANALYST     3000.00     20          4
    SCOTT      ANALYST     3100.00     20          5JAMES      CLERK        950.00     30          1
    WARD       SALESMAN    1250.00     30          2--sal相等
    MARTIN     SALESMAN    1250.00     30          3--sal相等
    TURNER     SALESMAN    1500.00     30          4
    ALLEN      SALESMAN    1600.00     30          5
    BLAKE      MANAGER     2850.00     30          6
     
    14 rows selected
      

  4.   

    这里的partition by 与group by是一个意思么?
      

  5.   

    都差不多,
    row_number() over (partition by deptno order by sal)
    partition by先分组然后获得行号,最后返回结果
    group by将得到的结果分组。

    group by 和 partition by的比较