2016-07-11 3 views
0

Ich versuche, die Vertica-Ranganalysefunktion zu verwenden, um eine Rangspalte zu erstellen, die durch eine Spalte partitioniert ist, aber nur Datensätze in einer Reihe enthält. Zum Beispiel unter der Abfrage die Ausgabe unterhalb der Abfrage erzeugtRANK-Datensätze partitioniert durch eine Spalte in Serie (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 

ich meine Abfrage ändern könnte einen Rang Spalte enthält, die die folgende Ausgabe erzeugen würde

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 

Allerdings ist mein Ziel, über den Rang starten, wenn eine Reihe gebrochen wird, so dass die gewünschte Ausgabe ist:

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 

gibt es eine Möglichkeit, dies mit der RANK-Funktion zu erreichen, oder gibt es eine andere Möglichkeit, es in vertica sQL zu tun?

Danke, Ben

Antwort

3

Dies ist eine Lücke-and-Inseln Problem, wo der schwierige Teil ist, um die Gruppen zu identifizieren, für eine row_number() Berechnung zu verwenden. Eine Lösung verwendet einen Unterschied von Zeilennummern der verschiedenen Gruppen zu identifizieren:

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; 

Die Logik dahinter heikel ist, wenn Sie es zuerst sehen. Ich rate Ihnen, die Unterabfrage auszuführen und die zwei row_number() Berechnungen zu verstehen - und zu beobachten, dass der Unterschied für die Gruppen, die Sie interessieren, konstant ist.

+0

Wow, das ist wirklich schlau! Ich danke dir sehr – mangodreamz

Verwandte Themen