Oracle-分析函数(累计求和,排序等)

打印 上一主题 下一主题

主题 985|帖子 985|积分 2955

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
Oracle-分析函数(累计求和,排序等)

在Oracle中分析函数又称为开窗函数
分为以下两类:
第一类:是聚合分析函数,重要包含(sum,count,AVG、MAX、MIN等),重要是对内部门组的数值按照要求内部聚合处置惩罚;
第二类:是排序分析函数,重要包含(ROW_NUMBER、DENSE_RANK、RANK等),根据差别要求呈现差别的排序方式。
布局函数先容:
  1. SELECT table.column,
  2. analysis_function() OVER ( [PARTITION BY 字符] [ORDER BY 字段 [rows]] ) as 统计值
  3. FROM table;
复制代码
analysis_function表示分析函数,对应的有sum,count,AVG、MAX、MIN,ROW_NUMBER、DENSE_RANK、RANK等;
OVER:开窗函数名;
partition by :为分组字段;
order by :指定排序字段;
rows:指定命据窗口(即指定分析函数要利用的行数)

  

一、聚合分析函数

一、聚合分析函数与聚合函数的差别
聚合分析函数可以在查询语句中,每一组每一行举行聚合,聚合函数只能通过group by 整体聚合。
二、聚合分析函数
聚合分析函数:()中必要填值
  1. --组内计数
  2. count() over(partition by ... order by ...)
  3. --组内最大值
  4. max() over(partition by ... order by ...)
  5. --组内最小值
  6. min() over(partition by ... order by ...)
  7. --组内求和,可计算累计求和
  8. sum() over(partition by ... order by ...)
  9. --组内均值
  10. avg() over(partition by ... order by ...)
  11. --组内的第一个值
  12. first_value() over(partition by ... order by ...)
  13. --组内的最后一个值
  14. last_value() over(partition by ... order by ...)
  15. --Lag函数可以在一次查询中取出当前行的同一字段的前面第N行的数据。
  16. lag() over(partition by ... order by ...)
  17. --Lead函数可以在一次查询中取出当前行的同一字段的后面第N行的值。
  18. lead() over(partition by ... order by ...)
复制代码
举例:
sum() over(partition by … order by …) 累计求和
  1. select 营销中心,事业部,产品编码,产品名称,品类,年份,月份,月,当月指标金额,sum(当月指标金额) over(partition by 营销中心, 事业部,产品编码,产品名称,品类,年份
  2. ORDER BY 月
  3. ) 月累计指标,
  4. sum(当月指标金额) over(partition by 营销中心,事业部,产品编码,年份
  5. ORDER BY 产品编码
  6. ) 全年指标
  7. FROM   TABLE;
复制代码
二、排序分析函数

分为 rank,dense_rank,row_number 三种排序方式。
对应的函数布局如下所示:
rank ( ) over ( [query_partition_clause]order_by_clause )
  1. --rank如果出现两个相同的数据,那么后面的数据就会直接跳过这个排名,比如:当第2名和第3名的利润相同时,rank的结果是1,2,2,4;
  2. select d,l,m,rank() over(partition by d order by l)  from aaa;
复制代码
dense_rank ( ) over ([query_partition_clause] order_by_clause )
  1. --dense_rank则不会跳过这个排名,结果是1,2,2,3
  2. select d,l,m,dense_rank() over(partition by d order by l)  from aaa;
复制代码
row_number ( ) over ( [query_partition_clause]order_by_clause )
  1. --row_number哪怕是两个数据完全相同,排名也会不一样,结果是1,2,3,4
  2. select d,l,m,row_number() over(partition by d order by l)  from aaa;
复制代码
通过上面的布局可实现按指定的字段分组排序,对于相同分组字段的效果集举行排序
排序分析函数:()中不填值
  1. --重复排序(1,2,3,4)
  2. row_number() over(partition by ... order by ...)
  3. --重复跳过排序(1,2,2,4)
  4. rank() over(partition by ... order by ...)
  5. --重复不跳过排序(1,2,2,3)
  6. dense_rank() over(partition by ... order by ...)
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

风雨同行

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表