2019

Oracle中的分析函数over

2019-03-19  本文已影响0人  第一次真好

常用聚合函数


select
  vn_char,
  vn_number 
from kk_test;
kk_test有10条数据
select
  vn_char,
  vn_number,
  --1+2+3+...+9+10=55
  sum(vn_number) over(partition by null) as total_number
from kk_test;
patition by null
select
  vn_char,
  vn_number,
  --partition by vn_char
  sum(vn_number) over(partition by vn_char) as total_partition_by_char
from kk_test;
partition by char

差不多明白over(partition by ...)是干什么的了吧,这儿说一下over(partition by ...)和group by的区别,请自行体会

--受限与group by 我们刷选的字段是有限的,且会改变记录数据,因为我们分组了,那么同一组只有一条数据
select
  vn_char,
  sum(vn_number) as total_by_char
from kk_test
group by vn_char
order by vn_char;
group by example

可以对比一下【partition by char】的那个例子,主要区别在于我们筛选的字段是不会收到限制的,记录条数也不会改变还是10条,现在这样是不是明白多了...

聚合函数() over(partition by ... order by ...)

select
  vn_number,
  --累计求和
  sum(vn_number) over(order by vn_number) as accu_number
from kk_test;
累计求和

其实这个语句完整的写法是这样的:

select
  vn_number,
  --累计求和
  sum(vn_number) over(order by vn_number) as accu_number1,
  --preceding:往前聚合窗口的大小,unbounded无穷大
  --current row:到当前行
  sum(vn_number) over(order by vn_number range between unbounded preceding and current row) as accu_number2,
  --following:往后聚合窗口的大小,0等于current row
  sum(vn_number) over(order by vn_number range between unbounded preceding and 0 following) as accu_number3  
from kk_test;
this is interesting

所以我们自由发挥一下,出现了如下的语句:

select
  vn_char,
  vn_number,
  --累计求和
  sum(vn_number) over(order by vn_number) as accu_number,
  --往前1行,往后1行
  sum(vn_number) over(order by vn_number range between 1 preceding and 1 following) as accu_number_1_1,
  --往前1行,往后无穷大
  sum(vn_number) over(order by vn_number range between 1 preceding and unbounded following) as accu_number_1_42,
  --按照vn_char分组一下
  sum(vn_number) over(partition by vn_char order by vn_number range between 1 preceding and 1 following) as accu_number_1_1_p
from kk_test;
人笨,只能多写写,多练练

常用的分析函数

上一篇 下一篇

猜你喜欢

热点阅读