博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
oracle 分析函数
阅读量:4702 次
发布时间:2019-06-10

本文共 2808 字,大约阅读时间需要 9 分钟。

Oracle-分析函数之连续求和        sum(…) over(…)Oracle-分析函数之排序值          rank()和dense_rank()Oracle-分析函数之排序后顺序号     row_number()Oracle-分析函数之取上下行数据     lag()和lead()

分析函数和聚合函数的区别

普通的聚合函数用group by分组,每个分组返回一个统计值,
 分析函数采用partition by分组,并且每组每行都可以返回一个统计值。
分析函数带有一个开窗函数over(),包含三个分析子句:
1分组(partition by)
2排序(order by)
3窗口(rows)
规则
sum(…) over( ),对所有行求和
sum(…) over( order by … ), 连续求和
sum(…) over( partition by… ),同组内所行求和
sum(…) over( partition by… order by … ),同第1点中的排序求和原理,只是范围限制在组内
select * from t1;

select sales_id, sales, dest, dept, revenue, sum(revenue) over() sum_order from test;

 

select sales_id, sales, dest, dept, revenue, sum(revenue) over(order by revenue) sum_order from test;

 select sales_id, sales, dest, dept, revenue, sum(revenue) over(partition by  sales_id) sum_order from test;

select sales_id, sales, dest, dept, revenue, sum(revenue) over(partition by  sales_id order by revenue) sum_order from test;

聚合函数RANK 和 dense_rank

【语法】 rank() over( [query_partition_clause] order_by_clause )

               dense_rank() over( [query_partition_clause] order_by_clause )

【功能】聚合函数RANK 和 dense_rank 主要的功能是计算一组数值中的排序值。

【参数】dense_rank与rank()用法相当

【区别】dence_rank在并列关系是,相关等级不会跳过。rank则跳过.

rank()是跳跃排序,有两个第二名时接下来就是第四名(同样是在各个分组内)

dense_rank()l是连续排序,有两个第二名时仍然跟着第三名。

rank() 函数

SELECT a.col1,a.col2,RANK() OVER(PARTITION BY col2 ORDER BY col1) "Rank" FROM xgj a;

select * from xgj_2;

select *  from (select rank() over(partition by a.subject order by a.score desc) rk,   a.*   from xgj_2 a) t  where t.rk <= 3;

合计功能:计算出数值(65,’语文’)在Order By score ,subject排序下的排序值,也就是score=65,subject=语文在排序以后的位置

SELECT RANK(65, '语文') WITHIN GROUP(ORDER BY score, subject) "Rank"  FROM xgj_2;

 

dense_rank()

   与rank()用法相当,但是有一个区别:dence_rank在并列关系是,相关等级不会跳过。rank则跳过. 

 

ROW_NUMBER() OVER (PARTITION BY COL1 ORDER BY COL2)

功能】表示根据COL1分组,在分组内部根据 COL2排序,而这个值就表示每组内部排序后的顺序编号(组内连续的唯一的)

row_number() 返回的主要是“行”的信息,并没有排名.

【参数】

【说明】Oracle分析函数

【主要功能】:用于取前几名,或者最后几名等

SELECT a.col1,a.col2,row_number() OVER(PARTITION BY col2 ORDER BY col1) "Ra" FROM xgj a;

 

lag()和lead()

这两个函数是偏移量函数,可以查出一个字段的上一个值或者下一个值,配合over来使用。

Lag和Lead分析函数可以在同一次查询中取出同一字段的前N行的数据(Lag)和后N行的数据(Lead)作为独立的列。

功能】表示根据COL1分组,在分组内部根据 COL2排序,而这个值就表示每组内部排序后的顺序编号(组内连续的唯一的)

lead () 下一个值 lag() 上一个值
【参数】
EXPR是从其他行返回的表达式
OFFSET是缺省为1 的正数,表示相对行数。希望检索的当前行分区的偏移量
DEFAULT是在OFFSET表示的数目超出了分组的范围时返回的值。

exp_str 是要做对比的字段

offset 是exp_str字段的偏移量 比如说 offset 为2 则 拿exp_str的第一行和第三行对比,第二行和第四行,依次类推,offset的默认值为1!

select a.caseid,

       a.stepid as currentStepID,
       a.actiondate as currentActionDate,
       lag(stepid)          over(partition by a.caseid order by a.stepid) preStep,
       lag(actiondate)   over(partition by a.caseid order by a.stepid) preActionDate,
       lead(stepid)        over(partition by a.caseid order by a.stepid) nextStep,
       lead(actiondate)  over(partition by a.caseid order by a.stepid) nextActionDate
  from lead_table a;

 

转载于:https://www.cnblogs.com/hello-wei/p/9851898.html

你可能感兴趣的文章
在Android源码下编译jni所需要知道的事~
查看>>
JavaScript实现Apache .htaccess 转化nginx生成器工具-toolfk程序员工具网
查看>>
Linux 下安装nginx的总结 (之前写的有问题))
查看>>
[转]微服务架构的理论基础 - 康威定律
查看>>
A1064. 排名计算
查看>>
ubuntu linux上配置samba服务器
查看>>
sdk 获取 vue 实例
查看>>
资源列表
查看>>
如何实现清浮动(转载)
查看>>
【Java程序】约瑟夫环
查看>>
借助第八代智能英特尔® 酷睿™ i7 处理器和 Unreal Swarm* 的强大性能快速构建光照...
查看>>
View Controller 生命周期的各个方法的用法
查看>>
去掉iview Modal组件中的取消和确定按钮
查看>>
媲美jQuery的JS框架----AngularJS(二)
查看>>
【译】Asp.Net 导出 Excel 数据的9种方案
查看>>
Python 快速统计数据的去重数和去重数据
查看>>
【心情随记】收拾屋子,整理心态
查看>>
课件动画做的牛不牛,看你有它没它!
查看>>
怎么用MindManager记笔记
查看>>
xargs命令
查看>>