2016-04-25 6 views
0

Hallo, wenn ich die folgende TabelleWie ordnen Sie mit mehreren Partitionen in DB2 ein?

id code  year 
-- ----  ---- 
1  a  2000 
1  b  2001 
1  b  2002 
1  b  2003 
1  c  2007 
2  a  1997 
3  f  2006 
3  f  2014 
3  a  2015 

Ich mag die Zeilen durch Partitionierung auf id und code Rang in die Lage sein, während sie von year Bestellung:

id code  year  ranked 
-- ----  ----  ------ 
1  a  2000  1 
1  b  2001  2 
1  b  2002  2 
1  b  2003  2 
1  c  2007  3 
2  a  1997  1 
3  f  2006  1 
3  f  2014  1 
3  a  2015  2 

ich versucht habe zu tun:

select distinct id, code, dense_rank() over(partition by id,code order by year) as ranked 

jedoch ergab dies

id code  year  ranked 
-- ----  ----  ------ 
1  a  2000  1 
1  b  2001  2 
1  b  2002  3 
1  b  2003  4 
1  c  2007  5 
2  a  1997  1 
3  f  2006  1 
3  f  2014  2 
3  a  2015  3 

d scheint es nur auf partitioniert zu haben id

Ich habe versucht, rank() und row_number() auch, aber diese nicht die gewünschte Tabelle geben. Fehle ich etwas? Ich bin sicher dichte_rank ist was ich brauche.

Antwort

2

Ich denke, Sie wollen dense_rank().

select id, code, year, 
     dense_rank() over (partition by id order by code) as rank; 
from t; 

Allerdings bedeutet dies nicht ganz, was Sie wollen, weil die Codes alphabetisch geordnet und Sie erscheinen die Bestellung durch das Minimum des Jahres zu wollen. Also, verwenden Sie zwei Ebenen von Fensterfunktionen:

select id, code, year, 
     dense_rank() over (partition by id order by minyear) as rank 
from (select id, code, year, 
      min(year) over (partition by id, code) as minyear 
     from t 
    ) t; 
+0

danke @Gordon Linoff. das hat funktioniert. – brucezepplin

Verwandte Themen