来源:http://blog.csdn.net/bbliutao/article/details/7727320

一、sum over

sum over主要用来对某个字段值进行逐步累加

SELECT   Name, Salary, SUM (Salary) OVER (ORDER BY Salary, Name) SubSal
    FROM   emp
    ORDER BY   Salary;

Name,   Salary,   Age 
    A,900,   20 
    B,900,   21 
    C,1000,   18 
    D,950,   20

执行后格式

Name,   Salary,   SubSal   
     A,       900,           900 
     B,       900,           1800 
     D,       950,           2750 
     C,       1000,         3750

sum(sal) over (partition by deptno) --按照不同的部门分组,对部门自身的员工工资连续求和
    partition by 是起着分组的作用


二、row_number over
    row_number() over ([partition by col1] order by col2) ) as 别名
    表示根据col1分组,在分组内部根据 col2排序
    而这个“别名”的值就表示每组内部排序后的顺序编号(组内连续的唯一的),[partition by col1] 可省
    略

row_number() over 按照partion by 分组,然后在每组内部按照 open_date 排序 得到返回
    的是内部排序的顺序编号

SELECT   t.family_id,
             t.package_id,
             t.phone,
             t.reason,
             t.open_date,
             ROW_NUMBER ()
                OVER (PARTITION BY family_id, package_id, phone
                      ORDER BY open_date DESC)
                rn
       FROM   zj_transaction_log t
     WHERE   TO_CHAR (t.open_date, 'yyyy-mm') >= '2011-03';

FAMILY_ID    PACKAGE_ID    PHONE    REASON    OPEN_DATE    RN
19811    100    ********861    ADC请求[校讯通-精装版]恢复处理    2011-3-6 14:16:29    1
19811    100    ********861    ADC请求[校讯通-精装版]暂停处理    2011-3-6 3:00:26    2
19823    100    ********667    ADC请求[精装版]暂停处理    2011-3-12 9:47:41    1
19823    100    ********667    ADC请求[校讯通-精装版]恢复处理    2011-3-7 19:03:30    2
19823    100    ********667    ADC请求[校讯通-精装版]暂停处理    2011-3-7 6:51:27    3
19841    100    ********328    ADC请求[精装版]恢复处理    2011-3-14 9:01:31    1
19841    100    ********328    ADC请求[精装版]暂停处理    2011-3-14 0:57:33    2
19869    100    ********172    ADC请求[校讯通-精装版]暂停处理    2011-3-5 2:55:17    1
19950    100    ********631    ADC请求[校讯通-精装版]恢复处理    2011-3-2 14:14:51    1

SELECT   t.family_id,
             t.package_id,
             t.phone,
             t.reason,
             t.open_date,
             ROW_NUMBER ()
                OVER (PARTITION BY family_id, package_id, phone
                  ORDER BY package_id DESC)
            rn
      FROM   zj_transaction_log t
     WHERE   TO_CHAR (t.open_date, 'yyyy-mm') >= '2011-03';

FAMILY_ID    PACKAGE_ID    PHONE    REASON    OPEN_DATE    RN
19811    100    ********861    ADC请求[校讯通-精装版]暂停处理    2011-3-6 3:00:26    1
19811    100    ********861    ADC请求[校讯通-精装版]恢复处理    2011-3-6 14:16:29    2
19823    100    ********667    ADC请求[精装版]暂停处理    2011-3-12 9:47:41    1
19823    100    ********667    ADC请求[校讯通-精装版]恢复处理    2011-3-7 19:03:30    2
19823    100    ********667    ADC请求[校讯通-精装版]暂停处理    2011-3-7 6:51:27    3
19841    100    ********328    ADC请求[精装版]暂停处理    2011-3-14 0:57:33    1
19841    100    ********328    ADC请求[精装版]恢复处理    2011-3-14 9:01:31    2
19869    100    ********172    ADC请求[校讯通-精装版]暂停处理    2011-3-5 2:55:17    1
19950    100    ********631    ADC请求[校讯通-精装版]恢复处理    2011-3-2 14:14:51    1

三、count over

SELECT   t.family_id,
             t.package_id,
             t.phone,
             t.open_date,
             t.reason,
             COUNT( * )
                OVER (PARTITION BY family_id, package_id, phone)
                rn
      FROM   zj_transaction_log t
     WHERE   TO_CHAR (t.open_date, 'yyyy-mm') >= '2011-03';

FAMILY_ID    PACKAGE_ID    PHONE    OPEN_DATE    REASON    RN
19811    100    ********861    2011-3-6 3:00:26    ADC请求[校讯通-精装版]暂停处理    2
19811    100    ********861    2011-3-6 14:16:29    ADC请求[校讯通-精装版]恢复处理    2
19823    100    ********667    2011-3-12 9:47:41    ADC请求[精装版]暂停处理    3
19823    100    ********667    2011-3-7 19:03:30    ADC请求[校讯通-精装版]恢复处理    3
19823    100    ********667    2011-3-7 6:51:27    ADC请求[校讯通-精装版]暂停处理    3
19841    100    ********328    2011-3-14 0:57:33    ADC请求[精装版]暂停处理    2
19841    100    ********328    2011-3-14 9:01:31    ADC请求[精装版]恢复处理    2
19869    100    ********172    2011-3-5 2:55:17    ADC请求[校讯通-精装版]暂停处理    1
19950    100    ********631    2011-3-2 14:14:51    ADC请求[校讯通-精装版]恢复处理    1

SELECT   t.family_id,
             t.package_id,
             t.phone,
             t.open_date,
             t.reason,
             COUNT( * )
                OVER (PARTITION BY family_id, package_id, phone
                order by open_date)
                rn
      FROM   zj_transaction_log t
     WHERE   TO_CHAR (t.open_date, 'yyyy-mm') >= '2011-03';

FAMILY_ID    PACKAGE_ID    PHONE    OPEN_DATE    REASON    RN
19811    100    ********861    2011-3-6 3:00:26    ADC请求[校讯通-精装版]暂停处理    1
19811    100    ********861    2011-3-6 14:16:29    ADC请求[校讯通-精装版]恢复处理    2
19823    100    ********667    2011-3-7 6:51:27    ADC请求[校讯通-精装版]暂停处理    1
19823    100    ********667    2011-3-7 19:03:30    ADC请求[校讯通-精装版]恢复处理    2
19823    100    ********667    2011-3-12 9:47:41    ADC请求[精装版]暂停处理    3
19841    100    ********328    2011-3-14 0:57:33    ADC请求[精装版]暂停处理    1
19841    100    ********328    2011-3-14 9:01:31    ADC请求[精装版]恢复处理    2
19869    100    ********172    2011-3-5 2:55:17    ADC请求[校讯通-精装版]暂停处理    1
19950    100    ********631    2011-3-2 14:14:51    ADC请求[校讯通-精装版]恢复处理    1

SELECT   t.family_id,
             t.package_id,
             t.phone,
             t.open_date,
             t.reason,
             COUNT( * )
                OVER (PARTITION BY family_id, package_id, phone
                order by package_id)
                rn
      FROM   zj_transaction_log t
     WHERE   TO_CHAR (t.open_date, 'yyyy-mm') >= '2011-03';

FAMILY_ID    PACKAGE_ID    PHONE    OPEN_DATE    REASON    RN
19811    100    ********861    2011-3-6 3:00:26    ADC请求[校讯通-精装版]暂停处理    2
19811    100    ********861    2011-3-6 14:16:29    ADC请求[校讯通-精装版]恢复处理    2
19823    100    ********667    2011-3-12 9:47:41    ADC请求[精装版]暂停处理    3
19823    100    ********667    2011-3-7 19:03:30    ADC请求[校讯通-精装版]恢复处理    3
19823    100    ********667    2011-3-7 6:51:27    ADC请求[校讯通-精装版]暂停处理    3
19841    100    ********328    2011-3-14 0:57:33    ADC请求[精装版]暂停处理    2
19841    100    ********328    2011-3-14 9:01:31    ADC请求[精装版]恢复处理    2
19869    100    ********172    2011-3-5 2:55:17    ADC请求[校讯通-精装版]暂停处理    1
19950    100    ********631    2011-3-2 14:14:51    ADC请求[校讯通-精装版]恢复处理    1

SELECT   t.family_id,
             t.package_id,
             t.phone,
             t.reason,
             COUNT( * )
                OVER (PARTITION BY family_id, package_id, phone
                      ORDER BY open_date DESC
                      ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
                 rn
      FROM   zj_transaction_log t
     WHERE   TO_CHAR (t.open_date, 'yyyy-mm') >= '2011-03';

FAMILY_ID    PACKAGE_ID    PHONE    OPEN_DATE    REASON    RN
19811    100    ********861    2011-3-6 3:00:26    ADC请求[校讯通-精装版]暂停处理    1
19811    100    ********861    2011-3-6 14:16:29    ADC请求[校讯通-精装版]恢复处理    2
19823    100    ********667    2011-3-7 6:51:27    ADC请求[校讯通-精装版]暂停处理    1
19823    100    ********667    2011-3-7 19:03:30    ADC请求[校讯通-精装版]恢复处理    2
19823    100    ********667    2011-3-12 9:47:41    ADC请求[精装版]暂停处理    3
19841    100    ********328    2011-3-14 0:57:33    ADC请求[精装版]暂停处理    1
19841    100    ********328    2011-3-14 9:01:31    ADC请求[精装版]恢复处理    2
19869    100    ********172    2011-3-5 2:55:17    ADC请求[校讯通-精装版]暂停处理    1
19950    100    ********631    2011-3-2 14:14:51    ADC请求[校讯通-精装版]恢复处理    1

SELECT   t.family_id,
             t.package_id,
             t.phone,
             t.reason,
             COUNT( * )
                OVER (PARTITION BY family_id, package_id, phone
                      ORDER BY package_id DESC
                      ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
                rn
      FROM   zj_transaction_log t
     WHERE   TO_CHAR (t.open_date, 'yyyy-mm') >= '2011-03';

FAMILY_ID    PACKAGE_ID    PHONE    REASON    RN
19811    100    ********861    ADC请求[校讯通-精装版]暂停处理    1
19811    100    ********861    ADC请求[校讯通-精装版]恢复处理    2
19823    100    ********667    ADC请求[精装版]暂停处理    1
19823    100    ********667    ADC请求[校讯通-精装版]恢复处理    2
19823    100    ********667    ADC请求[校讯通-精装版]暂停处理    3
19841    100    ********328    ADC请求[精装版]暂停处理    1
19841    100    ********328    ADC请求[精装版]恢复处理    2
19869    100    ********172    ADC请求[校讯通-精装版]暂停处理    1
19950    100    ********631    ADC请求[校讯通-精装版]恢复处理    1

四、rank\dense_rank  over

rank 的分析功能语法:
RANK ( ) OVER ( [query_partition_clause] order_by_clause )

rank 的合计功能语法:
RANK ( expr [, expr]... ) WITHIN GROUP
( ORDER BY
expr [ DESC | ASC ] [NULLS { FIRST | LAST }]
[, expr [ DESC | ASC ] [NULLS { FIRST | LAST }]]...
)

对于分析功能,
SELECT a.*,RANK() OVER(PARTITION BY col2 ORDER BY col1) "Rank" FROM table a;
已col2分组col1排序,rank与dense_rank用法相当,区别如下:
  
例如:当rank时为:
SELECT f.phone, f.student_name,
       RANK () OVER (PARTITION BY f.phone ORDER BY f.student_name) cnt
  FROM zs_family f
WHERE NVL (f.is_test, 0) <> 1
   AND LENGTH (f.phone) = 11
   AND f.phone NOT LIKE '%0%'
  
PHONE    STUDENT_NAME    CNT
********188    陈雅琳    1
********188    陈雅琳    1
********188    陈镇豪    3

而如果用dense_rank时为:
SELECT f.phone, f.student_name,
       dense_RANK () OVER (PARTITION BY f.phone ORDER BY f.student_name) cnt
  FROM zs_family f
WHERE NVL (f.is_test, 0) <> 1
   AND LENGTH (f.phone) = 11
   AND f.phone NOT LIKE '%0%'
  
PHONE    STUDENT_NAME    CNT
********188    陈雅琳    1
********188    陈雅琳    1
********188    陈镇豪    2

从上可知,都是对数据分组排序,差别在于以a分组,b排序的时候,dence_rank在并列关系时,相关等级不会跳过。rank则跳过(常用在排名)。

over 分析函数系列都十分类似。

对于合计功能:

SELECT
       RANK ('********188','陈雅琳') within group (ORDER BY f.phone,f.student_name) cnt
  FROM zs_family f
WHERE NVL (f.is_test, 0) <> 1
   AND LENGTH (f.phone) = 11
   AND f.phone NOT LIKE '%0%';

cnt
258

感觉就是查询定位该记录的在表中位置

函数专题:sum、row_number、count、rank\dense_rank over相关推荐

  1. oracle 函数_oracle中row_number、rank、dense_rank() 的区别(over函数)

    row_number的用途非常广泛,排序最好用它,它会为查询出来的每一行记录生成一个序号,依次排序且不会重复,注意使用row_number函数时必须要用over子句选择对某一列进行排序才能生成序号. ...

  2. SQL2005中row_number( )、rank( )、dense_rank( )、ntile( )函数的用法(2)

    SQL server 2005新增的几个函数,分别是 row_number( ). rank( )., DENSE_RANK( ). ntile( )下面以实例分别简单讲解. 1. row_numbe ...

  3. hive窗口函数之排名函数row_number、rank和dense_rank

    文章目录 简单排名 分组排名 练习1-取前两名学生 练习2-连续签到次数 排名函数主要有row_number.rank和dense_rank. 简单排名 row_number是行号,不会重复,rank ...

  4. SQL2005 四个排名函数(row_number、rank、dense_rank和ntile)的比较

    排名函数是SQL Server2005新加的功能.在SQL Server2005中有如下四个排名函数row_number.rank.dense_rank和ntile,需要的朋友可以参考下. 排名函数是 ...

  5. SQL With As 用法Sql 四大排名函数(ROW_NUMBER、RANK、DENSE_RANK、NTILE)简介

    Sql 四大排名函数(ROW_NUMBER.RANK.DENSE_RANK.NTILE)简介 排名函数是Sql Server2005新增的功能,下面简单介绍一下他们各自的用法和区别.我们新建一张Ord ...

  6. SQL2005中row_number( )、rank( )、dense_rank( )、ntile( )函数的用法(1)

    ROW_NUMBER.RANK.DENSE_RANK的用法 SQL Server 2005 引入几个新的排序(排名)函数,如ROW_NUMBER.RANK.DENSE_RANK等. 这些新函数使您可以 ...

  7. 四大排名函数(ROW_NUMBER、RANK、DENSE_RANK、NTILE)简介

    排名函数是Sql Server2005新增的功能,下面简单介绍一下他们各自的用法和区别.我们新建一张Order表并添加一些初始数据方便我们查看效果. 表结构和初始数据Sql 附上表结构和初始数据图: ...

  8. mysql rank函数_Sql 四大排名函数(ROW_NUMBER、RANK、DENSE_RANK、NTILE)简介

    排名函数是Sql Server2005新增的功能,下面简单介绍一下他们各自的用法和区别.我们新建一张Order表并添加一些初始数据方便我们查看效果. 表结构和初始数据Sql 附上表结构和初始数据图: ...

  9. java中rank函数_SQL中的排名函数(ROW_NUMBER、RANK、DENSE_RANK、NTILE)简介

    排名函数是Sql Server2005新增的功能,下面简单介绍一下他们各自的用法和区别. 在使用排名函数的时候需要注意以下三点: 1.排名函数必须有 OVER 子句. 2.排名函数必须有包含 ORDE ...

最新文章

  1. 后生可畏!中国军团称霸阅读理解竞赛RACE:微信AI称王,高中生力压腾讯康奈尔联队(附资料)...
  2. Centos7.5虚拟机无法ping通网关、外网IP地址
  3. WPF 类型“System.ComponentModel.ISupportInitialize”在未被引用的程序集中定义。
  4. MySQL优化从执行计划开始(explain超详细)
  5. Python enum的使用总结
  6. LeetCode MySQL 1270. 向公司CEO汇报工作的所有人
  7. 银行科技管理工作优化提升之我见
  8. Remastersys制作自己的Linux发行版
  9. Encrypt java_ESAPI对称加密使用JavaEncryptor
  10. 全面剖析雅虎助手以及网络实名的流氓行径(4)
  11. IOS 10.3.3 越狱
  12. 如何微信公众号中的视频保存下来
  13. 弄明白了清华校训“自强不息 厚德载物”的来龙去脉
  14. 超 3000 个特效镜头,复联 4 是如何「速成」的?
  15. ​你在淘宝剁手,钱却可能进入黑客的口袋
  16. php如何做直播api,网易云视频直播php版api
  17. OpenCV—Python 图像加减乘除-逻辑运算
  18. [源码、文档、分享] iOS/iPhone学习系列、代码教程----~~~持续更新中~~~
  19. 10种方法帮助网络管理员管理和维护网络
  20. Java 多线程线程安全(面试概念解答二)

热门文章

  1. python顺序结构的关键字_Python相关数据结构的排序
  2. 问题描述_vortex_新浪博客
  3. EPSnbsp;QOS体系图的解读
  4. mysql表文件创建_php文件创建mysql的表
  5. np实现sigmoid_【强基固本】基础算法:使用numpy实现逻辑回归随机梯度下降(附代码)...
  6. BZOJ1259:[CQOI2007]矩形rect(DFS)
  7. 【微信服务号开发】01.接入指南
  8. SQL Server 2008及以上版本出现”SQL Server 复制需要有实际的服务器名称才能连接到服务器...“的问题解决...
  9. SPARK学习之 --- eclipse / sbt / scala 配置
  10. JavaScript 实现Map效果