如何在 DB2 中对多个分区进行排名?

How to rank with multiple paritions in DB2?

嗨,如果我有以下 table

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

我希望能够通过按 idcode 分区对行进行排名,同时按 year:

排序
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

我试过:

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

然而这导致了

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

即它似乎只在 id

上分区

我也试过 rank()row_number(),但这些都没有达到我想要的 table。我错过了什么吗?我确定 dense_rank 是我需要的。

我想你想要 dense_rank()

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

但是,这并不能完全满足您的要求,因为代码是按字母顺序排序的,而您似乎希望按年份的最小值排序。所以,使用两级window函数:

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;