2016-07-11 2 views
0

Verticaランク分析関数を使用して列で区切られたランク列を作成しようとしていますが、系列内のレコードのみが含まれています。たとえば、クエリは以下の私は次の出力を生成するランクの列を含めるように私のクエリを変更でき列で分割されたRANKレコード(Vertica SQL)

select when_created, status 
from tablea 

when_created Status 
1/1/2015 ACTIVE 
3/1/2015 ACTIVE 
4/1/2015 INACTIVE 
4/6/2015 INACTIVE 
6/7/2015 ACTIVE 
10/9/2015 INACTIVE 

クエリ以下の出力を生成し

select 
when_created, status, rank() OVER (PARTITION BY status order by when_created) as rnk 
from tablea 

when_created Status rnk 
1/1/2015 ACTIVE 1 
3/1/2015 ACTIVE 2 
4/1/2015 INACTIVE 1 
4/6/2015 INACTIVE 2 
6/7/2015 ACTIVE 3 
10/9/2015 INACTIVE 3 

は、しかし、私の目標はランクときの上に開始されます

when_created Status rnk 
1/1/2015 ACTIVE 1 
3/1/2015 ACTIVE 2 
4/1/2015 INACTIVE 1 
4/6/2015 INACTIVE 2 
6/7/2015 ACTIVE 1 
10/9/2015 INACTIVE 1 

RANK関数を使用して、これを実現する方法はありますかのVerticaのSQLでそれを行うための別の方法があります:所望の出力があるので、シリーズが壊れていますか?

おかげで、

ベン

答えて

3

これはトリッキーな部分はrow_number()計算に使用するグループを識別することであるギャップおよびアイランドの問題です。一つの解決策は、異なるグループを識別するために、行番号の違いを使用しています。

select a.*, 
     row_number() over (partition by status, seqnum - seqnum_s order by when_created) as rnk 
from (select a.*, 
      row_number() over (order by when_created) as seqnum, 
      row_number() over (partition by status order by when_created) as seqnum_s 
     from tablea a 
    ) a; 

あなたが最初にそれを見たときに、この背後にある論理はトリッキーです。サブクエリを実行し、2つの計算を理解することをお勧めします。興味のあるグループの違いが一定であることを確認してください。

+0

本当に賢いですよ!どうもありがとうございます – mangodreamz

関連する問題