oracle分析函数over()

0x00简介

over(),oracle分析函数,使用分析函数对数据分析;


0x01用法

用在select之后,配合分组函数或分析函数分析数据;

1.rank 排名

查询每个班级的学生成绩及排名;

select class_name,student_name,score,rank() over(partition by class_name ORDER BY score desc) from student_score;

2.sum 求和

查询每个学生所在班级的成绩之和;

select class_name,student_name,score,sum(score) over(partition by class_name) from student_score;

3.比例

查询每个班级的男女比例;

select class_name,sex,cnt,sum(cnt) over(partition by class_name) as total,cnt/sum(cnt) over(class_name) as scale 
from (select class_name,sex,count(1) as cnt from student group by class_name,sex);

0x02和group分组函数的不同之处

1.行数

over分析函数的查询结果不影响数据列数,group函数的查询结果由分组的数量决定;

2.列数

group函数只能查询分组的列和分组函数,over分析函数无限制;


0x03示例代码

over和group函数结合使用:

 

select SEND_DATE,
       PROVINCE,
       BUS_TYPE,
       CONTENT_TYPE,
        sum(CONFIRM_NUM) over(partition by SEND_DATE, PROVINCE, BUS_TYPE) as TRIAL_NUM,
       CONFIRM_NUM,      
       CONFIRM_NUM / sum(CONFIRM_NUM) over(partition by SEND_DATE, PROVINCE, BUS_TYPE) as CONFIRM_RATE
  from (select to_Date(to_char(s.send_time, 'yyyy-mm-dd'), 'yyyy-mm-dd') as SEND_DATE ,
         s.calling_province as PROVINCE,
         s.calling_operator as BUS_TYPE,
         s.result as CONTENT_TYPE,
         count(1) as CONFIRM_NUM
    from tb_c_source s
   group by to_char(s.send_time, 'yyyy-mm-dd'),
            s.calling_province,
            s.result,
            s.calling_operator);


你可能感兴趣的:(over)