2017-03-03 50 views
0

我試圖讓此查詢以某種方式輸出。基本上,這是我得到的輸出:無法通過分區獲得正確的行號

+-------+------------+-------------+----------+--------+ 
| Col_A | Date | Subscr_Id | Segment | RowNum | 
+-------+------------+-------------+----------+--------+ 
|  1 | 16/09/2008 | 5,954,766 | UNKNOWN |  1 | 
|  2 | 17/09/2008 | 5,954,766 | UNKNOWN |  2 | 
|  3 | 24/09/2008 | 5,954,766 | UNKNOWN |  3 | 
|  4 | 25/09/2008 | 5,954,766 | UNKNOWN |  4 | 
|  5 | 24/06/2009 | 5,954,766 | CONSUMER |  1 | 
|  6 | 01/09/2009 | 5,954,766 | CONSUMER |  2 | 
|  7 | 09/11/2009 | 5,954,766 | CONSUMER |  3 | 
|  8 | 31/12/2009 | 5,954,766 | CONSUMER |  4 | 
|  9 | 01/01/2010 | 5,954,766 | CONSUMER |  5 | 
| 10 | 31/01/2010 | 5,954,766 | CONSUMER |  6 | 
| 11 | 28/02/2010 | 5,954,766 | CONSUMER |  7 | 
| 12 | 01/04/2010 | 5,954,766 | CONSUMER |  8 | 
| 13 | 28/06/2010 | 5,954,766 | UNKNOWN |  5 | 
| 14 | 14/11/2010 | 5,954,766 | UNKNOWN |  6 | 
| 15 | 09/06/2011 | 5,954,766 | UNKNOWN |  7 | 
| 16 | 22/09/2011 | 5,954,766 | UNKNOWN |  8 | 
| 17 | 18/12/2012 | 5,954,766 | UNKNOWN |  9 | 
| 18 | 12/02/2017 | 5,954,766 | UNKNOWN |  10 | 
| 19 | 14/02/2017 | 5,954,766 | UNKNOWN |  11 | 
| 20 | 20/02/2017 | 5,954,766 | UNKNOWN |  12 | 
| 21 | 16/09/2008 | 208,333,201 | ?  |  1 | 
| 22 | 18/12/2012 | 208,333,201 | ?  |  2 | 
| 23 | 12/02/2017 | 208,333,201 | CONSUMER |  1 | 
| 24 | 13/02/2017 | 208,333,201 | CONSUMER |  2 | 
| 25 | 14/02/2017 | 208,333,201 | CONSUMER |  3 | 
| 26 | 15/02/2017 | 208,333,201 | CONSUMER |  4 | 
| 27 | 20/02/2017 | 208,333,201 | CONSUMER |  5 | 
| 28 | 28/02/2017 | 208,333,201 | CONSUMER |  6 | 
+-------+------------+-------------+----------+--------+ 

我基本上希望RowNum列重置爲1每當Subscr_IdSegment值的變化。它幾乎可以工作,但正如您在第十三行看到的那樣,RowNum從5開始,而不是重置爲1。

我使用的查詢如下:

ROW_NUMBER() OVER (PARTITION BY Subscr_Id, Segment ORDER BY st.Subscr_Id, st.Effective_From_Dt) AS RowNum 

有沒有人能夠給我任何指針?

回答

0

您需要識別相鄰值,即使它們被其他值分隔時也是如此。這樣做的一個方法是使用行數的差,並且然後使用之後row_number()識別在相鄰的行:

select t.*, 
     row_number() over (partition by subscr_id, seqnum - seqnum_s 
          order by col_a 
         ) as rownum 
from (select t.*, 
      row_number() over (partition by subscr_id order by col_a) as seqnum, 
      row_number() over (partition by subscr_id, segment order by col_a) as seqnum_s, 
     from t 
    ) t; 

的邏輯是有點麻煩。運行子查詢以查看seqnum值。你會看到差異如何識別你想要的組。