• Oracle 中分组排序取值的问题


       整理一下排序:

    建表语句:
    create table EXAM
    (
      name    VARCHAR2(32),
      subject VARCHAR2(32),
      score   INTEGER
    )
    数据:
    INSERT INTO EXAM VALUES ('赵柳', '数学', '71');
    INSERT INTO EXAM VALUES ('张三', '数学', '81');
    INSERT INTO EXAM VALUES ('李四', '数学', '75');
    INSERT INTO EXAM VALUES ('起点', '数学', '88');
    INSERT INTO EXAM VALUES ('起点', '英语', '98');
    INSERT INTO EXAM VALUES ('李四', '英语', '86');
    INSERT INTO EXAM VALUES ('赵柳', '英语', '86');
    INSERT INTO EXAM VALUES ('张思', '英语', '33');
    INSERT INTO EXAM VALUES ('李四', '语文', '75');
    INSERT INTO EXAM VALUES ('张三', '语文', '81');
    INSERT INTO EXAM VALUES ('赵柳', '语文', '71');
    INSERT INTO EXAM VALUES ('起点', '语文', '88');

    1.row_number() over() 的用法:SELECT *,ROW_NUMBER() OVER(PARTITION BY '分组' ORDER BY '排序') RN FROM TABLE;
    SELECT t.name,t.subject,t.score, row_number() OVER (PARTITION BY t.subject ORDER BY t.score DESC) rn FROM exam t ;

    2:rank() over()跳跃排序
    对于row_number() over() 来说,如果两个值相等,区分不出前后,如下图所示:

    rank() over()是跳跃排序的,是可以有两个第二名的,后面跟着第三名;

    SELECT t.name,t.subject,t.score, rank() OVER (PARTITION BY t.subject ORDER BY t.score DESC) rn FROM exam t ;

    3:dense_rank() over()

    如果想 两个第二名之后跟着是第三名:SELECT t.name,t.subject,t.score, dense_rank() OVER (PARTITION BY t.subject ORDER BY t.score DESC) rn FROM exam t ;

     


  • 相关阅读:
    UML类关系:依赖、关联、聚合、组合(收藏)
    java常用设计模式八:代理模式
    java常用设计模式三:原型模式
    java常用设计模式总览
    java常用设计模式七:装饰模式
    java常用设计模式六:适配器模式
    Sword C语言原子操作
    C语言 宽字符串
    C语言 字符串切割
    C语言 sscanf函数补充
  • 原文地址:https://www.cnblogs.com/wangjianly/p/9313581.html
Copyright © 2020-2023  润新知