zoukankan      html  css  js  c++  java
  • Oracle 排序分析函数之ROW_NUMBER、RANK和DENSE_RANK

    我们都知道分析函数功能很强大,可能需要写很复杂的标准SQL才能办到或不可能办到的事,使用分析函数却能很容易完成。我们经常会用到排序分析函数,如ROW_NUMBER,RANK,DENSE_RANK。
    这三个函数都是排序函数,那么有什么不同呢,下面看个例子:
    SQL> select empno,
    2 ename,
    3 deptno,
    4 sal,
    5 row_number() over(partition by deptno order by sal) sql_rownum,
    6 rank() over(partition by deptno order by sal) sql_rank,
    7 dense_rank() over(partition by deptno order by sal) as sal_denserank
    8 from emp;
         EMPNO ENAME          DEPTNO        SAL SQL_ROWNUM   SQL_RANK SAL_DENSERANK
    ---------- ---------- ---------- ---------- ---------- ---------- -------------
    7934 MILLER 10 1300 1 1 1
    7782 CLARK 10 2450 2 2 2
    7839 KING 10 5000 3 3 3
    7369 SMITH 20 800 1 1 1
    7566 JONES 20 2975 2 2 2
    7902 FORD 20 3000 3 3 3
    7900 JAMES 30 950 1 1 1
    7521 WARD 30 1250 2 2 2
    7654 MARTIN 30 1250 3 2 2
    7844 TURNER 30 1500 4 4 3
    7499 ALLEN 30 1600 5 5 4
    7698 BLAKE 30 2850 6 6 5
    已选择12行。
    上面SQL中,这三个函数都采用deptno列进行分组,以列sal进行升序排序。
    我们看empno为7900-7698的行。在相同分组和相同字段相同顺序排序的情况下:row_number函数只是单纯的返回行排序后的序号;rank函数在sal相同时,采用相同的行号,但是之后的行会继续按单纯的排序号继续编号;
    dense_rank返回在结果,会在sal相同时采用相同的排序号,但是之后按上面的序号继续排序。
    也就是我们通过说rank会跳号,dense_rank不会跳号。
  • 相关阅读:
    Navicat远程连接服务器Mysql
    JSP与Servlet之间传值
    JSP获取绝对路径
    PIL的库学习
    科学计算与可视化
    预测球类比赛结果
    预测球类比赛结果
    汉诺塔问题
    有进度条圆周率计算
    turtle学习心得
  • 原文地址:https://www.cnblogs.com/zhaoshuangshuang/p/3275525.html
Copyright © 2011-2022 走看看