我有这种数据:
contract nr startdate
1 12 01-01-2000
1 12 03-01-2000
1 22 07-01-2000
2 77 12-04-2001
2 78 17-04-2001
我在这里的简单目标是,在考虑到开始日期的基础上,对特定合同中的每个数字进行排名。输出应如下所示:
contract nr startdate my_rank
1 12 01-01-2000 1
1 12 03-01-2000 1
1 22 07-01-2000 2
2 77 12-04-2001 1
2 78 17-04-2001 2
我尝试了几乎所有可能的组合,但无法弄清楚。
select dense_rank() over
(partition by contract order by nr) as my_rank,* from my_data
以上内容非常接近,问题在于在某些情况下将1分配给最近的合同,在其他情况下将其分配给最近的合同(?)。 有提示吗?
答案 0 :(得分:3)
您的排名是nr
。
如果要按合同日期进行排名,则需要合并。但是这些在合同上是不同的。因此,这需要进行额外的计算:
select dense_rank() over (partition by contract order by min_startdate) as my_rank,
d.*
from (select d.*,
min(startdate) over (partition by contract, nr) as min_startdate
from my_data d
) d;
我不知道您要订购的开始日期是min()
还是max()
。