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

  • 相关阅读:
    【算法总结】搜索算法(上)
    New Beginning
    好想退役啊【笑
    【NOIP2012】DAY1+DAY2题解
    【NOIP2013】Day2不完全题解+代码
    【NOIP2013】DAY1题解+代码
    【NOIP2014】DAY2题解+代码
    【游记】NOIP2015造纸记
    【ACM-ICPC 2018 徐州赛区网络预赛】E. End Fantasy VIX 血辣 (矩阵运算的推广)
    【ACM-ICPC 2018 沈阳赛区网络预赛】不太敢自称官方的出题人题解
  • 原文地址:https://www.cnblogs.com/BradMiller/p/1834213.html
Copyright © 2011-2022 走看看