• Oracle 的开窗函数 rank,dense_rank,row_number


    1、开窗函数和分组函数的区别

    分组函数是指按照某列或者某些列分组后进行某种计算,比如计数,求和等聚合函数进行计算。

    开窗函数是指基于某列或某些列让数据有序,数据行数和原始数据数相同,依然能曾现个体数据的原貌。

    事例数据

    create table student_scores(
    stu_id varchar2(10),--学号
    stu_name varchar2(20),--姓名
    course varchar2(5),--课程
    score number(5,2),--分数
    constraint pk_stuid_course primary key (stu_id,course)
    );

    insert into student_scores(stu_id,stu_name,course,score) values('10001','周杰伦','语文','85');
    insert into student_scores(stu_id,stu_name,course,score) values('10001','周杰伦','数学','96');
    insert into student_scores(stu_id,stu_name,course,score) values('10001','周杰伦','英语','67');
    insert into student_scores(stu_id,stu_name,course,score) values('10002','谢霆锋','语文','71');
    insert into student_scores(stu_id,stu_name,course,score) values('10002','谢霆锋','数学','97');
    insert into student_scores(stu_id,stu_name,course,score) values('10002','谢霆锋','英语','100');
    insert into student_scores(stu_id,stu_name,course,score) values('10003','苏有朋','语文','79');
    insert into student_scores(stu_id,stu_name,course,score) values('10003','苏有朋','数学','65');
    insert into student_scores(stu_id,stu_name,course,score) values('10003','苏有朋','英语','80');
    insert into student_scores(stu_id,stu_name,course,score) values('10004','刘德华','语文','41');
    insert into student_scores(stu_id,stu_name,course,score) values('10004','刘德华','数学','61');
    insert into student_scores(stu_id,stu_name,course,score) values('10004','刘德华','英语','62');
    insert into student_scores(stu_id,stu_name,course,score) values('10005','小龙女','语文','94');
    insert into student_scores(stu_id,stu_name,course,score) values('10005','小龙女','数学','95');
    insert into student_scores(stu_id,stu_name,course,score) values('10005','小龙女','英语','96');

    2、分组函数:group by 

    按照课程进行分组,可以进行如下计算

    select course,count(*) cou,avg(score) avgs,max(score) maxs,min(score) mins
    from student_scores
    group by course;

      

    COURSE

    COU

    AVGS

    MAXS

    MINS

    1

    数学

    5

    82.8

    97

    61

    2

    语文

    5

    74

    94

    41

    3

    英语

    5

    81

    100

    62

    3、开窗函数:rank() ,dense_rank(),row_number()

    每个学科按照分数倒序排名 

    select stu_id,stu_name,course,score,rank() over(partition by course order by score desc) rank
    from student_scores;

      

    STU_ID

    STU_NAME

    COURSE

    SCORE

    RANK

    1

    10002

    谢霆锋

    数学

    97.00

    1

    2

    10001

    周杰伦

    数学

    96.00

    2

    3

    10005

    小龙女

    数学

    95.00

    3

    4

    10003

    苏有朋

    数学

    65.00

    4

    5

    10004

    刘德华

    数学

    61.00

    5

    6

    10002

    谢霆锋

    英语

    100.00

    1

    7

    10005

    小龙女

    英语

    96.00

    2

    8

    10003

    苏有朋

    英语

    80.00

    3

    9

    10001

    周杰伦

    英语

    67.00

    4

    10

    10004

    刘德华

    英语

    62.00

    5

    11

    10005

    小龙女

    语文

    94.00

    1

    12

    10001

    周杰伦

    语文

    85.00

    2

    13

    10003

    苏有朋

    语文

    79.00

    3

    14

    10002

    谢霆锋

    语文

    71.00

    4

    15

    10004

    刘德华

    语文

    41.00

    5

     注意分组函数和开窗函数针对数据在维度上的变化,分组函数使个体数据小时。开窗函数保留个体。

  • 相关阅读:
    Semaphore
    财报分析
    关于C#中的new的用法
    Linux(CentOS)下Postgresql数据库的安装配置
    CentOS下实现SCP免输密码传送文件
    HiveQL逻辑执行顺序
    CentOS上以源码的方式安装Redis笔记
    Python学习心得(七) 深入理解threading多线程模块
    SQL Server返回两个Date日期相差共多少天零多少小时零多少分钟零多少秒
    Python学习心得(六) 反射机制、装饰器
  • 原文地址:https://www.cnblogs.com/theonewu/p/9936686.html
Copyright © 2020-2023  润新知