2017-03-03 11 views
0

このクエリを特定の方法で出力しようとしています。私は基本的にRowNum列が1たびSubscr_IdまたはSegment値の変化にリセットしたいパーティションを使用して行番号を正しく取得できません

+-------+------------+-------------+----------+--------+ 
| 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 | 
+-------+------------+-------------+----------+--------+ 

:基本的にはこれは私が取得しています出力されます。ほとんど動作しますが、13行目に示すように、RowNumは1にリセットされずに5に戻ります。

次のように私が使用しているクエリは次のとおりです。

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の値を確認できます。相違があなたが望むグループをどのように識別しているかがわかります。

関連する問題