oracle 分析函数
FUNCTION_NAME(<参数>,…)
OVER
(<PARTITION BY 表达式,…> <ORDER BY 表达式 <ASC | DESC> <NULLS FIRST | NULLS LAST>> <WINDOWING子句>)
缺省时相当于RANGE UNBOUNDED PRECEDING
1. 值域窗(RANGE WINDOW)
RANGE N PRECEDING
仅对数值或日期类型有效,选定窗为排序后当前行之前,某列(即排序列)值大于/小于(当前行该列值 ?/+ N)的所有行,因此与ORDER BY子句有关系。
2. 行窗(ROW WINDOW)
ROWS N PRECEDING
选定窗为当前行及之前N行。
还可以加上BETWEEN AND 形式,例如RANGE BETWEEN m PRECEDING AND n FOLLOWING
1. 自动汇总函数rollup,cube!
rollup 类似 分类小计的功能!类似以前写的group by 语句。不同在于加了rollup之后,对每个分组都有了统计的功能,而且最后还有个合计。
1 2009-1-10 东莞 黄埔 10 5
2 2009-1-10 汕头 增城 10 10
3 2009-1-10 广州 增城 40 0
4 2009-1-10 东莞 增城 20 10
select 地点,shop, sum("总台数(T-T)") from ab group by rollup(shop,地点);
东莞 增城 20
东莞 黄埔 10
东莞 30
广州 增城 40
广州 40
汕头 增城 10
汕头 10
80
select 地点,shop, sum("总台数(T-T)") from ab group by cube(shop,地点);
80
增城 70
黄埔 10
东莞 30
东莞 增城 20
东莞 黄埔 10
广州 40
广州 增城 40
汕头 10
汕头 增城 10
二:rank 函数, rank,dense_rank,row_number
聚合函数RANK 和 dense_rank 主要的功能是计算一组数值中的排序值。
1. RANK ( ) OVER ( [query_partition_clause] order_by_clause ) 分析功能
这个写法的order by语句必须。选吃每个分组里面排序的号。如果存在相同的排名,则不隔号。出现1224排列。
dense_rank() over()[query_partion_clause order_by_clause]可以避免重复排序的问题 比如一个组内出现1223。
rank() 合计功能 格式 rank(colvalue) within group (orber by partion) 计算排序的列的某个值(colvalue)的排名。
rank 和 dense_rack区别在于dense_rack,在并列关系是,相关等级不会跳过,即出现1223的排名情况。
上面两种函数都出现排名出现重复的情况 1234,但是row_number() over (partition_by order_by_partion)
三:lag,lead函数
lag和lead函数相反,lead函数见前面的文章。
四:sum,avg,max,min移动计算数据
sum() over(patition_by order_by) avg() over(partition_by order_by range between 1 preceding and 1 following )
五:ratio_to_report报表处理函数
oracle 8i引入的格式如下: RATIO_TO_REPORT (expr) OVER (query_partition_clause)
除报告详细数据外,许多报告中还包括每行总数的百分比。
六:first,last取基数的分析函数
first_value(字段)over( partition_by_expr order_by_expr)
返回组中数据窗口的第一个值。
查询:
select id
,"总台数(T-T)"
,ab.地点
, last_value("总台数(T-T)")over(partition by ab.地点 order by id desc)
,last_value("总台数(T-T)")over(partition by ab.地点)
,first_value("总台数(T-T)")over(partition by ab.地点 order by id desc)
from ab
结果:
4 20 增城 20 10 20
3 40 增城 40 10 20
2 10 增城 10 10 20
1 10 黄埔 10 10 10