rownum注意問題2

利用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

 

 

 




    

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章