2012-12-21 49 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)