zoukankan      html  css  js  c++  java
  • oracle中某列连续相同值的记录数统计(一个简单的例子)

          row_number() OVER (PARTITION BY COL1 ORDER BY COL2) 表示根据COL1分组,在分组内部根据 COL2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的).   

          与rownum的区别在于:使用rownum进行排序的时候是先对结果集加入伪列rownum然后再进行排序,而此函数在包含排序从句后是先排序再计算行号码.  row_number()和rownum差不多,功能更强一点(可以在各个分组内从1开时排序).  

          rank()是跳跃排序,有两个第二名时接下来就是第四名(同样是在各个分组内).  

          dense_rank()l是连续排序,有两个第二名时仍然跟着第三名。相比之下row_number是没有重复值的 .  

          lag(arg1,arg2,arg3): arg1是从其他行返回的表达式 arg2是希望检索的当前行分区的偏移量。是一个正的偏移量,时一个往回检索以前的行的数目。 arg3是在arg2表示的数目超出了分组的范围时返回的值。

    create table a ( id number(8) not null, val number(8) ) /

    insert into a(id,val) values(1,5);

    insert into a(id,val) values(2,8);

    insert into a(id,val) values(3,8);

     insert into a(id,val) values(5,8);

     insert into a(id,val) values(9,6);

    insert into a(id,val) values(11,6);

    insert into a(id,val) values(22,8);

    insert into a(id,val) values(40,8);

     insert into a(id,val) values(41,5);

    commit;

    select * from a order by id;

    --[查询语句]--

    select val,count(*) from ( select id,val,row_number() over (order by id) - row_number() over (partition by val order by id) x from a ) group by val,x order by min(id);

    --[解析]--

    select id,val,row_number() over (order by id) x from a; //按id进行排序

    select id,val,row_number() over (partition by val order by id) x from a; //按val分组,分组内按id排序

    select id,val,row_number() over (order by id) - row_number() over (partition by val order by id) x from a;//id排序值 减去 val分组内id排序值 = 连续相同值的排序值

  • 相关阅读:
    八、springboot 简单优雅的通过docker-compose 构建
    【并发编程】ThreadLocal其实很简单
    计算机网络
    相似度
    不同激活函数的区别
    快速排序+归并排序
    xgboost
    c++面试
    PCA算法和SVD
    各种排序算法的时间复杂度和空间复杂度
  • 原文地址:https://www.cnblogs.com/BradMiller/p/1834213.html
Copyright © 2011-2022 走看看