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排序值 = 连续相同值的排序值

  • 相关阅读:
    poj3608Bridge Across Islands(旋转卡壳)
    旋转卡壳(rotate吧)
    旋转卡壳(rotate吧)
    poj2187 Beauty Contest
    poj2187 Beauty Contest
    poj1637 Sightseeing tour
    poj1637 Sightseeing tour
    bzoj2756 [SCOI2012]奇怪的游戏
    bzoj2756 [SCOI2012]奇怪的游戏
    noip胡测之8.15(没有正解)
  • 原文地址:https://www.cnblogs.com/BradMiller/p/1834213.html
Copyright © 2011-2022 走看看