• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    Oracle排名函数(Rank)实例详解

    --已知:两种排名方式(分区和不分区):使用和不使用partition

    --两种计算方式(连续,不连续),对应函数:dense_rank,rank

    ·查询原始数据:学号,姓名,科目名,成绩

    select * from t_score

    S_ID
    S_NAME
    SUB_NAME
    SCORE
    1
    张三
    语文
    80.00
    2
    李四
    数学
    80.00
    1
    张三
    数学
    0.00
    2
    李四
    语文
    50.00
    3
    张三丰
    语文
    10.00
    3
    张三丰
    数学
     
    3
    张三丰
    体育
    120.00
    4
    杨过
    JAVA
    90.00
    5
    mike
    c++
    80.00
    3
    张三丰
    Oracle
    0.00
    4
    杨过
    Oracle
    77.00
    2
    李四
    Oracle
    77.00

    ·查询各学生科目为Oracle排名(简单排名)
    select sc.s_id,sc.s_name,sub_name,sc.score,
    rank() over (order by score desc) 名次
    from t_score sc
    where sub_name='Oracle'

    S_ID
    S_NAME
    SUB_NAME
    SCORE
    名次
    4
    杨过
    Oracle
    77.00
    1
    2
    李四
    Oracle
    77.00
    1
    3
    张三丰
    Oracle
    0.00
    3

    对比:rank()与dense_rank():非连续排名与连续排名(都是简单排名)
    select sc.s_id,sc.s_name,sub_name,sc.score,
    dense_rank() over (order by score desc) 名次
    from t_score sc
    where sub_name='Oracle'

    S_ID
    S_NAME
    SUB_NAME
    SCORE
    名次
    4
    杨过
    Oracle
    77.00
    1
    2
    李四
    Oracle
    77.00
    1
    3
    张三丰
    Oracle
    0.00
    2

    ·查询各学生各科排名(分区排名)
    select sc.s_id,sc.s_name,sub_name,sc.score,
    rank() over
    (partition by sub_name order by score desc) 名次
    from t_score sc

    S_ID
    S_NAME
    SUB_NAME
    SCORE
    名次
    4
    杨过
    JAVA
    90.00
    1
    4
    杨过
    Oracle
    77.00
    1
    2
    李四
    Oracle
    77.00
    1
    3
    张三丰
    Oracle
    0.00
    3
    5
    mike
    c++
    80.00
    1
    3
    张三丰
    数学
     
    1
    2
    李四
    数学
    80.00
    2
    1
    张三
    数学
    0.00
    3
    3
    张三丰
    体育
    120.00
    1
    1
    张三
    语文
    80.00
    1
    2
    李四
    语文
    50.00
    2
    3
    张三丰
    语文
    10.00
    3

    ·查询各科前2名(分区排名)

    ·类似:新闻表,求栏目点击率在前3位的新闻。
    商品表,求各类别销售额在前10位的商品。

    select * from (
    select sc.s_id,sc.s_name,sub_name,sc.score,
    dense_rank() over
    (partition by sub_name order by score desc) 名次
    from t_score sc
    ) x
    where x.名次=2

    S_ID
    S_NAME
    SUB_NAME
    SCORE
    名次
    4
    杨过
    JAVA
    90.00
    1
    4
    杨过
    Oracle
    77.00
    1
    2
    李四
    Oracle
    77.00
    1
    3
    张三丰
    Oracle
    0.00
    2
    5
    mike
    c++
    80.00
    1
    3
    张三丰
    数学
     
    1
    2
    李四
    数学
    80.00
    2
    3
    张三丰
    体育
    120.00
    1
    1
    张三
    语文
    80.00
    1
    2
    李四
    语文
    50.00
    2

    ·查询各同学总分
    select s_id,s_name,sum(score) sum_score from t_score
    group by s_id,s_name

    S_ID
    S_NAME
    SUM_SCORE
    1
    张三
    80.00
    2
    李四
    207.00
    3
    张三丰
    130.00
    4
    杨过
    167.00
    5
    mike
    80.00

    ·根据总分查询各同学名次
    select x.*,
    rank() over (order by sum_score desc) 名次
    from (
    select s_id,s_name,sum(score) sum_score from t_score
    group by s_id,s_name ) x

    S_ID
    S_NAME
    SUM_SCORE
    名次
    2
    李四
    207.00
    1
    4
    杨过
    167.00
    2
    3
    张三丰
    130.00
    3
    1
    张三
    80.00
    4
    5
    mike
    80.00
    4

    语法:
    rank() over (order by 排序字段 顺序)
    rank() over (partition by 分组字段 order by 排序字段 顺序)
    1.顺序:asc|desc 名次与业务相关:
    示例:找求优秀学员:成绩:降序 迟到次数:升序
    2.分区字段:根据什么字段进行分区。
    问题:分区与分组有什么区别?
    ·分区只是将原始数据进行名次排列(记录数不变),
    ·分组是对原始数据进行聚合统计(记录数变少,每组返回一条),注意:聚合。

    脚本:

    create table t_score
    (
     autoid number primary key,
     s_id  number(3),
     s_name char(8) not null,
     sub_name varchar2(20),
     score number(10,2)
    );
    insert into t_score (autoid, s_id, s_name, sub_name, score)
    values (8, 1, '张三 ', '语文', 80);
    insert into t_score (autoid, s_id, s_name, sub_name, score)
    values (9, 2, '李四 ', '数学', 80);
    insert into t_score (autoid, s_id, s_name, sub_name, score)
    values (10, 1, '张三 ', '数学', 0);
    insert into t_score (autoid, s_id, s_name, sub_name, score)
    values (11, 2, '李四 ', '语文', 50);
    insert into t_score (autoid, s_id, s_name, sub_name, score)
    values (12, 3, '张三丰 ', '语文', 10);
    insert into t_score (autoid, s_id, s_name, sub_name, score)
    values (13, 3, '张三丰 ', '数学', null);
    insert into t_score (autoid, s_id, s_name, sub_name, score)
    values (14, 3, '张三丰 ', '体育', 120);
    insert into t_score (autoid, s_id, s_name, sub_name, score)
    values (15, 4, '杨过 ', 'java', 90);
    insert into t_score (autoid, s_id, s_name, sub_name, score)
    values (16, 5, 'mike ', 'c++', 80);
    insert into t_score (autoid, s_id, s_name, sub_name, score)
    values (3, 3, '张三丰 ', 'oracle', 0);
    insert into t_score (autoid, s_id, s_name, sub_name, score)
    values (4, 4, '杨过 ', 'oracle', 77);
    insert into t_score (autoid, s_id, s_name, sub_name, score)
    values (17, 2, '李四 ', 'oracle', 77);
    commit;
    您可能感兴趣的文章:
    • Oracle 分析函数RANK(),ROW_NUMBER(),LAG()等的使用方法
    • Oracle row_number() over()解析函数高效实现分页
    • 深入探讨:oracle中row_number() over()分析函数用法
    • oracle中rownum和row_number()
    • Oracle数据库rownum和row_number的不同点
    • Oracle中rank,over partition函数的使用方法
    • Oracle开发之分析函数(Rank, Dense_rank, row_number)
    上一篇:oracle排名函数的使用方法分享
    下一篇:Oracle数据库并行查询出错的解决方法
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    Oracle排名函数(Rank)实例详解 Oracle,排名,函数,Rank,实例,