2012-12-21 53 views
3

我寫過這段代碼的朋友。它會生成srlnum,很多。記錄和lotsrl的 srlnum將總數爲1至5000記錄5000 後,它會再次從1開始..生成號碼

/* Formatted on 2012/12/21 15:00 (Formatter Plus v4.8.8) */ 
      SELECT ROW_NUMBER() OVER (ORDER BY a.co_series, a.CATEGORY, 
        a.dnr_from) srlnum, 
        CASE 
         WHEN MOD (ROW_NUMBER() OVER (ORDER BY a.co_series, a.CATEGORY, 
           a.dnr_from), 
           5000 
           ) = 0 
         THEN 5000 
         ELSE MOD (ROW_NUMBER() OVER (ORDER BY a.co_series, a.CATEGORY, 
           a.dnr_from), 
           5000 
           ) 
        END lotsrl 
       FROM iq_dnrfl a, iq_cocat b 
      WHERE a.co_series = 'S1' 
       --SYS_CONTEXT ('TFR_CTX', 'p$_csrcod') 
       AND a.CATEGORY = 9 
       --SYS_CONTEXT ('TFR_CTX', 'p$_category') 
       AND a.co_series = b.co_series 
       AND a.CATEGORY = b.CATEGORY 
       AND NVL (olf_flag, 'N') = 'Y'; 

一些這樣的事

srlnum ,lotsrl 
1   1 
2   2 
3   3 
4   4 
5   5 
.   . 
.   . 
.   . 
5000  5000 
5001  1 
. 
. 
. 
10000 5000 
10001 1 
. 
. 
. 

但現在我想另一個列應該產生1到5000之間的數字1和2從另一個數字在1到5000之間。

類似這樣的東西

srlnum ,lotsrl ,num 
1   1  1 
2   2  1 
3   3  1 
4   4  1 
5   5  1 
.   .  1 
.   .  1 
.   .  1 
5000  5000 1 
5001  1  2 
.  2  2 
.  3  2 
.   2 
10000 5000 2 
10001 1  3 
.    3 
. 
. 

請幫我的朋友

回答

3

我想你可以試試這個方法,但因爲我沒有你完整的數據我用我的套

select a,b, 
rank() over (partition by b order by a) c 
from tbl 
order by a; 

http://www.sqlfiddle.com/#!4/2f63a/11

+0

這很好,因爲您不需要對分區子句進行復雜的計算,但是如果oracle引擎不重寫代碼,select_中的_select將對性能造成影響,導致性能下降通過第二層次的分析功能。或者你可以寫在一個單一的選擇? –

+0

HEY Ajith Sasidharan非常感謝 –

0

儘量選擇以此爲num

TRUNC(ROW_NUMBER() OVER (ORDER BY a.co_series, a.CATEGORY, a.dnr_from)/5001) + 1 
0

可能:

trunc((ROW_NUMBER() OVER (ORDER BY a.co_series, a.CATEGORY, a.dnr_from)/5000)