如何在 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
我希望能够通过按 id
和 code
分区对行进行排名,同时按 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;
嗨,如果我有以下 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
我希望能够通过按 id
和 code
分区对行进行排名,同时按 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;