rownum注意问题2

来源:互联网 发布:工信部大数据行动 编辑:程序博客网 时间:2024/05/18 07:49

利用rownum可以得到连续数字中的一段。例如有以下数据:

 

fphm,kshm
2014,00000001
2014,00000002
2014,00000003
2014,00000004
2014,00000005
2014,00000007
2014,00000008
2014,00000009
2013,00000120
2013,00000121
2013,00000122
2013,00000124
2013,00000125

 

希望实现最终结果如下:

2014      00000001       00000005
2014      00000007       00000009

2013      00000120       00000122

2013      00000124       00000125

 

解决方案:

一. 利用rownum伪列 实现SQL:

  select b.fphm,min(b.kshm),max(b.kshm)
from (
        select a.*,to_number(a.kshm-rownum) cc
        from (
                select * from t order by fphm,kshm
        ) a
)  b
group by b.fphm,b.cc
/

 

二、利用rownum分析函数

SELECT fphm, MIN(kshm),MAX(kshm)

FROM
  ( SELECT  fphm, kshm, kshm-ROW_NUMBER() OVER (PARTITION BY fphm ORDER BY kshm ) AS RN

  FROM T

)
   GROUP BY fphm,RN;

 

三、最简洁SQL

select max(fphm),min(kshm),max(kshm)
from test
group by fphm||khsm-rownum

 

 

其他:

1. 可以通过rownum实现间断数据的分割。

2. 可以利用rownum求一组不连续数据的最小值。(这通常可以用来补足一串数字,很有用,曾经用过)

 

 

文章来源:http://www.itpub.net/viewthread.php?tid=354052&extra=&page=1

更多解决方案:http://blog.itpub.net/post/5042/27936