zoukankan      html  css  js  c++  java
  • 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 ;

     


  • 相关阅读:
    安卓adb
    图数据库学习
    分布式架构演进
    多活架构
    异地多活
    分布式CRDT
    技术架构的战略和战术原则
    分布式金融架构课笔记
    使用jackson进行json序列化时进行敏感字段脱敏(加密)或者忽略
    读书笔记《演进式架构》
  • 原文地址:https://www.cnblogs.com/wangjianly/p/9313581.html
Copyright © 2011-2022 走看看