2016-08-18 3 views
0

Ich habe die folgende Datentabelle namens "Tier" und ich möchte Rank und gruppieren nach Klon-Version basierend auf Tier.Ranking von Gruppierung in SQL

Ich habe versucht, den folgenden Code zu verwenden, aber es fehlt die Gruppierung Aspekt, die ich suche. So kommt es zurück.

select 
x.animal 
, x.clone_version 
, row_number() over(partition by x.clone_version order by animal desc) 
from animal x 

Dies ist, was der obige Code zurückgibt.

Animal Clone_Version RankGroup 
dog  0    2 
dog  0    1 
dog  1    1 
dog  2    2 
dog  2    1 

Ich möchte diese durch Gruppierung, so die Ausgabe wäre die folgenden.

Animal Clone_Version RankGroup 
dog  0    3 
dog  0    3 
dog  1    2 
dog  2    1 
dog  2    1 

Muss ich eine select-Anweisung in der FROM-Klausel verwenden, oder gibt es eine Möglichkeit, die row_number() over(partition by....order by...) erlauben die Gruppierung neu konfigurieren?

Antwort

0

Sie benötigen ein DENSE_RANK:

select 
x.animal 
, x.clone_version 
, dense_rank() 
    over(partition by x.animal  -- for each animal 
     order by clone_version desc) -- based on descending version 
from animal x 

Aber wenn Ihre Klon-Version ist es das gleiche wie immer steigt:

select 
x.animal 
, x.clone_version 
, MAX(clone_version) 
    over(partition by x.animal) - clone_version + 1 
from animal x 
+0

Dank !!! Lief wie am Schnürchen. Wenn Sie eine Chance bekommen, können Sie erklären, wie der Teil "- clone_version + 1" funktioniert? Ich sehe, dass es funktioniert, aber ich kämpfe darum, warum es funktioniert. – AlmostThere

+0

@AlmostThere: Der 'MAX' gibt die höchste' clone_version' für jedes 'Tier' zurück. Dann subtrahieren Sie die aktuelle 'clone_version' und fügen eins hinzu, um mit' 1' anstelle von '0' zu beginnen. – dnoeth

+0

Ich habe ein wichtiges Datenelement vergessen und mein OP umformuliert. – AlmostThere