zoukankan      html  css  js  c++  java
  • 分析函数 over用法 之row_number() runk_number

    分析函数用于计算基于组的某种聚合值,每个组返回多个行,而聚合函数每个组只返回一个行

    表:

    create table TB_SCORE

    (
    id NUMBER(10),
    class VARCHAR2(10),
    sname VARCHAR2(30),
    score NUMBER(10)
    )

     插入数据代码如下

    insert into tb_score (ID, CLASS, SNAME, SCORE)
    values (1, '数学', '学生1', 22);

    insert into tb_score (ID, CLASS, SNAME, SCORE)
    values (2, '数学', '学生1', 66);

    insert into tb_score (ID, CLASS, SNAME, SCORE)
    values (3, '英语', '学生1', 88);

    insert into tb_score (ID, CLASS, SNAME, SCORE)
    values (4, '英语', '学生1', 77);

    insert into tb_score (ID, CLASS, SNAME, SCORE)
    values (5, '英语', '学生1', 88);

    insert into tb_score (ID, CLASS, SNAME, SCORE)
    values (6, '数学', '学生1', 7);

    insert into tb_score (ID, CLASS, SNAME, SCORE)
    values (7, '数学', '学生1', 88);

    执行:SELECT * FROM tb_score,结果如下

    1.row_number()

    row_number() over (partition by colume1 order by colume2 desc) as columename

    注释:

    可以用来分组排序:

    这个主要是可用来获取rowid,普通的获取rowid 时,如果条件上的rowid不是从1开始取值,就会报错,因为rowid取值的时候每一次都是从一开始计数,所以会用分析函数获取,在这种情况下用分析函数,里面的colume1 必须是唯一的,不然会重复.

    eg:

     (1)按科目分组,再按成绩倒序

    SELECT t.*,  row_number()over (partition by t.class order by t.score desc) as 名次 FROM  tb_score t

    结果如下:

    (2)取每门课前两名的成绩:

    SELECT * FROM
    (
    SELECT t.*,
    row_number() over(partition by t.class order by t.score desc) as 名次
    FROM tb_score t
    ) t1
    where t1.名次<3

    结果如下:

    (3)取每门课成绩前两名的平均值

    SELECT avg(t1.score) ,t1.class FROM
    (
    SELECT t.class,t.score,
    row_number() over(partition by t.class order by t.score desc) as 名次
    FROM tb_score t
    ) t1
    where t1.名次<3
    group by t1.class

    结果如下:

    2:ranK(),dense_rank();

    (1) rank

    SELECT t.class,t.score,
    rank() over(partition by t.class order by t.score desc) as 名次
    FROM tb_score t

    结果如下

    (2)dense_rank

     SELECT t.class,t.score,
    rank() over(partition by t.class order by t.score desc) as 名次
    FROM tb_score t

    结果如下:

    总结:

    row_number() over 排序时,没有并列,rank() over和dense_rank() over 有并列

    但是,rank() over是并列后跳过,而dense_rank()over是并列后连续

  • 相关阅读:
    出现过拟合与欠拟合的原因以及解决方案
    Oracle数据库连接生成DDL
    CentOS 7 安装 maven
    基于Spring mvc 的Websocket 开发
    HttpComponents之httpclient
    java filter 实现权限控制
    java hasmap对象的深复制实现:字节码复制和对象序列化成字符串复制比较。
    eatwhatApp开发实战(二)
    eatwhatApp开发实战(一)
    [安卓安全] 01.安卓本地数据存储:Shared Preferences安全风险浅析
  • 原文地址:https://www.cnblogs.com/xinheng-blog/p/5673001.html
Copyright © 2011-2022 走看看