函数专题:sum、row_number、count、rank\dense_rank over
来源: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相关推荐
- oracle 函数_oracle中row_number、rank、dense_rank() 的区别(over函数)
row_number的用途非常广泛,排序最好用它,它会为查询出来的每一行记录生成一个序号,依次排序且不会重复,注意使用row_number函数时必须要用over子句选择对某一列进行排序才能生成序号. ...
- SQL2005中row_number( )、rank( )、dense_rank( )、ntile( )函数的用法(2)
SQL server 2005新增的几个函数,分别是 row_number( ). rank( )., DENSE_RANK( ). ntile( )下面以实例分别简单讲解. 1. row_numbe ...
- hive窗口函数之排名函数row_number、rank和dense_rank
文章目录 简单排名 分组排名 练习1-取前两名学生 练习2-连续签到次数 排名函数主要有row_number.rank和dense_rank. 简单排名 row_number是行号,不会重复,rank ...
- SQL2005 四个排名函数(row_number、rank、dense_rank和ntile)的比较
排名函数是SQL Server2005新加的功能.在SQL Server2005中有如下四个排名函数row_number.rank.dense_rank和ntile,需要的朋友可以参考下. 排名函数是 ...
- SQL With As 用法Sql 四大排名函数(ROW_NUMBER、RANK、DENSE_RANK、NTILE)简介
Sql 四大排名函数(ROW_NUMBER.RANK.DENSE_RANK.NTILE)简介 排名函数是Sql Server2005新增的功能,下面简单介绍一下他们各自的用法和区别.我们新建一张Ord ...
- SQL2005中row_number( )、rank( )、dense_rank( )、ntile( )函数的用法(1)
ROW_NUMBER.RANK.DENSE_RANK的用法 SQL Server 2005 引入几个新的排序(排名)函数,如ROW_NUMBER.RANK.DENSE_RANK等. 这些新函数使您可以 ...
- 四大排名函数(ROW_NUMBER、RANK、DENSE_RANK、NTILE)简介
排名函数是Sql Server2005新增的功能,下面简单介绍一下他们各自的用法和区别.我们新建一张Order表并添加一些初始数据方便我们查看效果. 表结构和初始数据Sql 附上表结构和初始数据图: ...
- mysql rank函数_Sql 四大排名函数(ROW_NUMBER、RANK、DENSE_RANK、NTILE)简介
排名函数是Sql Server2005新增的功能,下面简单介绍一下他们各自的用法和区别.我们新建一张Order表并添加一些初始数据方便我们查看效果. 表结构和初始数据Sql 附上表结构和初始数据图: ...
- java中rank函数_SQL中的排名函数(ROW_NUMBER、RANK、DENSE_RANK、NTILE)简介
排名函数是Sql Server2005新增的功能,下面简单介绍一下他们各自的用法和区别. 在使用排名函数的时候需要注意以下三点: 1.排名函数必须有 OVER 子句. 2.排名函数必须有包含 ORDE ...
最新文章
- 后生可畏!中国军团称霸阅读理解竞赛RACE:微信AI称王,高中生力压腾讯康奈尔联队(附资料)...
- Centos7.5虚拟机无法ping通网关、外网IP地址
- WPF 类型“System.ComponentModel.ISupportInitialize”在未被引用的程序集中定义。
- MySQL优化从执行计划开始(explain超详细)
- Python enum的使用总结
- LeetCode MySQL 1270. 向公司CEO汇报工作的所有人
- 银行科技管理工作优化提升之我见
- Remastersys制作自己的Linux发行版
- Encrypt java_ESAPI对称加密使用JavaEncryptor
- 全面剖析雅虎助手以及网络实名的流氓行径(4)
- IOS 10.3.3 越狱
- 如何微信公众号中的视频保存下来
- 弄明白了清华校训“自强不息 厚德载物”的来龙去脉
- 超 3000 个特效镜头,复联 4 是如何「速成」的?
- ​你在淘宝剁手,钱却可能进入黑客的口袋
- php如何做直播api,网易云视频直播php版api
- OpenCV—Python 图像加减乘除-逻辑运算
- [源码、文档、分享] iOS/iPhone学习系列、代码教程----~~~持续更新中~~~
- 10种方法帮助网络管理员管理和维护网络
- Java 多线程线程安全(面试概念解答二)
热门文章
- python顺序结构的关键字_Python相关数据结构的排序
- 问题描述_vortex_新浪博客
- EPSnbsp;QOS体系图的解读
- mysql表文件创建_php文件创建mysql的表
- np实现sigmoid_【强基固本】基础算法:使用numpy实现逻辑回归随机梯度下降(附代码)...
- BZOJ1259:[CQOI2007]矩形rect(DFS)
- 【微信服务号开发】01.接入指南
- SQL Server 2008及以上版本出现”SQL Server 复制需要有实际的服务器名称才能连接到服务器...“的问题解决...
- SPARK学习之 --- eclipse / sbt / scala 配置
- JavaScript 实现Map效果