请教大家
with a as(select  111 id,  0 value from  dualunion all
select  1111 id,  1 value from  dual
union all
select  222 id,  3 value from  dual
union all
select  333 id,  5 value from  dual
union all
select  444 id,  1 value from  dual
union all
select  555 id,  0 value from  dual
union all
select  666 id,  2 value from  dual
union all
select  777 id,  0 value from  dual
union all
select  888 id,  1 value from  dual
union all
select  999 id,  0 value from  dual)
select * from a
大家可以看到 1111的值 1 和444的值1差两条2记录
444的值1 和888的值 1 差3条记录请教大家如何查出 相邻2条1之间的最大值例如上面的结果 就是查出 两条相邻1之间的 最大记录数为3

解决方案 »

  1.   

    select T.*,rn-lag(rn,1,null) over( order by rn)  diff  from (
    select a.*,ROWNUM RN from a ) T WHERE T.VALUE=1 
      

  2.   

    select max(rn)
      from (select rn - lag(rn) over(order by rownum) - 1 rn
              from (select a.*, rownum rn from a)
             where value = 1)
      

  3.   

    我先去吐一会儿真心觉得真是什么样的需求的SQL都有啊为啥不能自己在应用层写一下啊,应用层只是数据搬运工吗??
      

  4.   

    with a as(select  111 id,  0 value from  dualunion all
    select  1111 id,  1 value from  dual
    union all
    select  222 id,  3 value from  dual
    union all
    select  333 id,  5 value from  dual
    union all
    select  444 id,  1 value from  dual
    union all
    select  555 id,  0 value from  dual
    union all
    select  666 id,  2 value from  dual
    union all
    select  777 id,  0 value from  dual
    union all
    select  888 id,  1 value from  dual
    union all
    select  999 id,  0 value from  dual)
    select * from a
    还有 如何查 例如 select  888 id,  1 value from  dual
    union all
    select  999 id,  0 value from  dual
    相邻记录值 1 0
    总共出现了几次相邻记录值 1 后面不是0的 总共出现了几次
      

  5.   


    你把整个表的所有数据传输到应用层,进行计算,得到一个结果。他把数据在数据库进行计算传输到应用层一个结果,哪个可能的效率高?如果数据库不会瘫痪,那就把压力给数据库,如果数据库可能瘫痪,那就把压力给网络和应用层分担。
    我们俩讨论的问题和这个帖子可能没啥关系了。从 应用服务器 ⇒ 数据库这样的层次角度来讲,应用服务器对数据库是多对一的关系。并不是说需要将所有数据传输到应用层去处理,而是说明显数据库应该做的事情,那就交给数据库去做。
    例如数据过滤,集合运算(这个地方其实就需要讨论了,哪个要做哪个不要做)。而排序这样的事情,消耗大量的内存和IO,不用多,只要几十个DB Session同时做大量的排序,
    自己在草纸上算算需要多少内存,需要多少临时表空间,数据库多痛苦,结果啥样我也不用说了。
    而你排不排序,其实网络传输量是不变的。而且复杂的SQL语句的可维护性的难度也不言自明吧
    (那种一句完成所有事情的SQL高手写的代码,是,SQL写的是很牛逼,但是带来的后期维护难度不亚于登珠穆朗玛峰)。我的观点是,数据库仅仅负责数据存取,尽量的要简洁,高效。
    应用服务器可以负责一定的数据整理工作,这样整体的平衡更好。应用服务器挂了还可以加应用服务器,影响一小块,毕竟别的应用服务器和数据库还可以继续提供服务的。
    你数据库服务器down了,影响度比应用服务器挂掉来的大的多(就算是你用的是数据库集群)。
      

  6.   


    在应用服务器上写代码需要内存和IO,但是负荷不会都集中在数据库服务器上,
    我的目的是为了帮助数据库分担负荷。让大量数据排序最后拿走少量的几条,
    说实在的,这样的数据库物理设计,或者是数据取得方式本身就需要重新检讨一下了,
    这种目的的需求本身确实更多,但是为了达到这样的目的,肯定有更合适的方式,
    真心不能这么折磨数据库。其实我想说的无非就是“平衡”二字,代码复杂度和可维护性的平衡,
    数据库服务器和应用服务器之间的负荷平衡,内存消耗和处理时间的平衡,等等。偏了那一边儿都不好。
    这也是我们IT人员应该沉淀经验的地方吧,也是最值钱的地方。